如何在Visual Studio中利用命令行集成Dotfuscator混淆处理

本文主要内容为使用命令行方式操作Dotfuscator,并将其集成到Visual Studio中,以便于直接生成发布。
另:本文使用的Dotfuscator版本为:集成在Visual Studio 2015 社区版中的Dotfuscator CE版本。

创建友好的Dotfuscator项目文件

Dotfuscator项目文件本质是一个xml,下文主要描述使用Dotfuscator可视化工具创建项目文件。

  1. 首先在Visual Studio中打开Dotfuscator:点击菜单栏中的工具 > PreEmptive Protection - Dotfuscator打开Dotfuscator。

  2. 此处默认新建了Dotfuscator项目,建议先进行保存,将文件保存至你要混淆项目的解决方案文件夹中,如,个人保存的位置为:E:\Projects\OpenSourceProject\ReferenceDoc\Dotfuscator\Samples\DotfuscatorSample\DotfuscatorSample.xml

保存到解决方案文件夹并非必须,此处如此处理可以为了后面进一步处理更加方便。

  1. 添加待混淆文件,如图所示:

添加待混淆文件

  1. 修改文件路径,将文件路径修改为如下图所示:点击属性,查看项目属性 - configdir(就是之前的保存位置),然后切换回输入,点击输入中第三个按钮编辑输入(那支笔),将路径中与configdir匹配的部分替换为**${configdir}**(注意是大括号)。

处理此步骤亦不是必须的,这样处理的原因是为了让我们的配置与本地无关(相对路径),方便其他人合作使用。

查看configdir

修改路径

  1. 至此,基本配置就可以了,点击生成项目就可以进行混淆了。至于其他更多配置见官方文档。

本地可以直接在Dotfuscator工具中点击菜单栏中的帮助 > 帮助目录(此为中文文档,基础的配置基本都有)。
帮助文件本地目录参考(中文帮助):C:\Program Files (x86)\Microsoft Visual Studio 14.0\PreEmptive Solutions\Dotfuscator and Analytics Community Edition\zh-Hans

配置Visual Studio命令调用Dotfuscator

  1. 主要操作就是编辑生成后事件:右击项目属性,切换到生成事件页面,编辑后期生成事件命令行,添加如下代码:

此处为了保证只有在Release的模式下使用混淆,故添加了Release判断。

    if $(ConfigurationName)==Release "C:\Program Files (x86)\Microsoft Visual Studio 14.0\PreEmptive Solutions\Dotfuscator and Analytics Community Edition\dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml"

代码解释:dotfuscator命令行工具+参数+项目混淆配置文件;其中配置文件之前保存到解决方案文件夹下,故此出可以直接用解决方案文件目录来索引。

代码中唯一不足就是命令行工具使用了绝对路径,vs中的宏参数没有可以直接使用的,若读者有啥好方法将此变为相对路径,望通知。 —— 但关于系统中添加环境变量的法子就不要了,个人不喜。

  1. 如果你在此处下一步需要进一步的打包处理,而你又需要Debug模式下一样可以打包测试。如,本人使用WiX打包,需要配置文件路径,方便一点就是要配置为生成路径,但是release模式下,需要将混淆的打包进去,而非直接生成的文件。此时,你不能改打包配置(改路径的话,debug会用不了),所以,你需要在将混淆过的文件拷贝到原来的release生成目录。所以我最后完整的生成事件就是如下代码了:

注意:经测试,如果在Dotfuscator中将生成路径设为文件来源路径,可以生成还会自动覆盖,但软件会用不了,具体原因不明。

    if $(ConfigurationName)==Release "C:\Program Files (x86)\Microsoft Visual Studio 14.0\PreEmptive Solutions\Dotfuscator and Analytics Community Edition\dotfuscatorcli.exe" /q "$(SolutionDir)DotfuscatorSample.xml"
    if $(ConfigurationName)==Release xcopy /e /y "$(SolutionDir)Dotfuscated\*.*" "$(TargetDir)" 

代码中的copy目录可以见Dotfuscator配置的生成目录:

查看Dotfuscator生成目录


奇葩史

关于Xamarin.Android中启用ProGuard后导致生成时java.exe错误问题解决

解决参考链接:

问题描述

选择启用Proguard后,进行项目生成操作,提示错误:“java.exe”已退出,代码为 1。

Proguard启用步骤:Xamarin.Android项目属性——Android Options页面——Packaging标签——勾选Enable Proguard

解决方法

  1. 下载最新版ProGuard的zip包(版本为5.3),下载地址为:https://sourceforge.net/projects/proguard/files/
  2. 由于ProGuard是没有安装程序的,故后面需要将zip解压到对应目录。
  3. 启动Android SDK Manager,查看菜单下方的SDK Path——查找sdk的位置。例如,我的位置是D:\Android\sdk(个人强迫症,调整过的),一般情况下,默认位置为C:\Users\你的用户名\AppData\Local\Android\android-sdk。而Proguard文件夹则位于此文件夹的tools文件夹中,如我的位置就是:D:\Android\sdk\tools\proguard
  4. 关闭所有可能访问SDK的开发环境(防止占用),然后将 proguard 文件夹命名为 proguard_old (用于备份,防止搞坏了可以恢复,另其中某些文件在下面还要用)。
  5. 将新版的proguard文件夹拷贝到tools文件夹中 —— 注意文件夹名称与上面原来的名称一样,这是为 proguard
  6. 最后,将配置文件从之前的 proguard_old 文件夹中拷贝到新的 proguard 文件夹中。一般是以下三个文件:proguard-android.txt, proguard-android-optimize.txtproguard-project.txt
  7. 最后的最后就是项目在启用ProGuard后重新生成了。

其他

关于其他ProGuard内容可以查看以下内容进一步学习:Xamarin.Android部署——应用程序发布准备


理:奇葩史

开源协议及知识共享协议简单介绍

旧地址:http://blog.canself.com/licenseindex/
https://www.shisujie.com/blog/LicenseIndex

本文为加强个人作品的保护以及尊重他人作品而整理。

作为一名程序员,你可能会面临开源协议的选择;
而作为网络博文的写作者,你亦可能需要对知识共享许可协议做一定了解。
关于协议作用不限于上述举例,请勿狭义理解。

协议详细内容链接【英文内容】:

开源协议

相关协议介绍中文版 —— 来自开源中国红薯

个人推荐 MIT 协议(亦是个人常用),内容相对开放。

趣味协议

  • WTFPL – Do What the Fuck You Want to Public License —— 个人常译为 “你想干嘛就干嘛协议”,看个人喜好了。
    • 这应该是最自由的开源协议了吧。如果你对自己的作品觉得没啥需要保护的,但又想加个开源协议,这个就是不二之选了。

知识共享许可协议

简要参考

协议英文 协议中文 协议图片
CC BY 署名
CC BY-SA 署名-相同方式共享
CC BY-NC 署名-非商业性使用
CC BY-NC-SA 署名-非商业性使用-相同方式共享
CC BY-NC-ND 署名-非商业性使用-禁止演绎

点击此处帮助选择许可协议


掘:奇葩史

Log4net快速索引参考

官方项目地址:The Apache log4net project
本文内容仅为相关项参考,不进行具体使用讨论
另转载请注明出处

Log4net快速索引参考

Log4net主要有以下三个部件:

  • loggers —— 记录器:开发者通过它来写日志
  • appenders —— 输出位置/目标控制器:通过它控制日志需要记录在哪些地方
  • layouts —— 输出格式控制器:通过它控制日志的输出格式或内容

注意事项:在使用配置文件(App.config)处理log4net时,需要在AssemblyInfo.cs文件中加上 [assembly: log4net.Config.XmlConfigurator(Watch = true)],否则无法输出;
当然这不是唯一解决方法(但应该是最简单方便的了),更多方法见官方文档:Apache log4net™ Manual - Configuration


loggers

日志级别

标识日志的重要性。

Log4net默认提供以下5个级别:

  • DEBUG —— 调试使用,如记录一些变量的值
  • INFO —— 一般信息,如记录一些进度情况
  • WARN —— 警告信息,如记录可忽略的异常信息
  • ERROR —— 错误信息,如记录一些错误异常
  • FATAL —— 致命错误信息,如记录软件崩溃信息

重要/严重程度:DEBUG < INFO < WARN < ERROR < FATAL.

以下为示例使用:

ILog log = LogManager.GetLogger("logname");
log.Info("message");

日志记录控制

即表示日志是否需要记录

与日志级别相比,多了以下两个等级:

其他等级按照其重要程度控制。

  • ALL —— 表示所有日志都需要记录
  • OFF —— 表示所有日志都不需要记录,即关闭日志记录

此内容常在配置文件中配置,示例如下:

<logger name="yourlogname">
    <level value="INFO" />
</logger>

ILog log = LogManager.GetLogger("yourlogname");
log.Info("test");

注意:日志记录级别的控制还可以在<root>元素内控制所有记录器的记录级别。


appenders

控制输出目标位置

常用的输出目标控制器主要有以下两个:

  • log4net.Appender.ConsoleAppender —— 用于输出到控制台,调试期间使用频率较高
  • log4net.Appender.FileAppender —— 用于记录到文件,软件应用发布后使用频率较高

当然,log4net还提供了一系列的控制器,具体内容见文末表格。


layouts

控制日志输出格式及要输出的内容

最常用的输出格式控制器为:log4net.Layout.PatternLayout

log4net.Layout.PatternLayout

以下为常用的格式化参数——ConversionPattern:

  • %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
  • %n(new line):换行
  • %d(datetime):输出当前语句运行的时刻
  • %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
  • %t(thread id):当前语句所在的线程ID
  • %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
  • %c(class):当前日志对象的名称,即类名称或日志记录器的名称
  • %L:输出语句所在的行号
  • %F:输出语句所在的文件名
  • %-数字:表示该项的最小长度,如果不够,则用空格填充

其示例如下,如PatternLayout的输出格式定义为:

%r [%t]%-5p %c - %m%n

则最终将输出内容为:

176 [main] INFO  org.foo.Bar - Located nearest gas station.

关于log4net提供的更多输出格式控制器见文末表格。


其他内容

必须元素

<root>在配置文件中必须添加

过滤器-Filters

用于精确控制不同输出目标控制器,如两个输出目标控制器可以使用不同的日志输出级别。


常用的完整示例

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
    
    <log4net>
        <root>
            <level value="WARN" />
            <appender-ref ref="FileAppender" />
            <appender-ref ref="ConsoleAppender" />
        </root>

        <logger name="yourlognameorfullclassname">
            <level value="DEBUG"/>
        </logger>

        <appender name="FileAppender" type="log4net.Appender.FileAppender">
            <file value="log-file.txt" />
            <appendToFile value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>

        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>
    </log4net>
</configuration>

更多示例配置见官方文档:Apache log4net™ Config Examples


参考表格

appenders-输出目标控制器

内容见官方文档:Appenders

layouts-输出格式控制器

内容见官方文档:Layouts

Filters-过滤器

内容见官方文档:Filters


掘:奇葩史

[译]:Orchard扩展——初步理解Orchard

返回目录索引
原文链接:First Steps into Orchard
译文链接:Orchard扩展——初步理解Orchard

本文的目标是帮助我们快速了解Orchard。由于Orchard中有太多的概念要理解,所以在深入理解之前,我们有必要对它有个整体的了解。因此,本文开始是以任何web用户都能理解为共同基础,然后在逐步深入的同时,引入相关的专业术语。

当你完成本文的阅读后,你就对Orchard有了足够的理解,以此你可以在处理Orchard(以一个设计者或开发者的身份)时,不会被它的高级架构和术语等搞晕。在本文介绍中,每一个新的术语都是以粗体表示,因此你需要在往下学习前确保你已经理解了遇到的术语。

本文中还包含了许多其他页面的链接 —— 含有相关内容更具体的解释,因此你可以将本文作为出发点。关于一些Orchard一般性的问题,如什么是Orchard,Orchard从何而来,请阅读:原文:Frequently Asked Questions。而关于更多技术上的内容,请阅读:原文:How Orchard works

Looking at Orchard as…

介绍Orchard基础最好的办法是看用户在访问网站时,能够有什么样的角色。其中包括:普通用户(亦叫读者/访问者/访客——reader/visitor/guest),管理员,设计者和开发者。

用户

Orchard网站和其他任何网站一样 —— 以一个前台页面开始,用户-user可以通过首页内的链接访问其他页面。而由于网站涉及不同领域,它的内容也会不一样(可以是静态页面,博客,wiki,电子商务等等)。

管理员

管理员可以访问网站的以下几个方面:

  1. 在安装Orchard时,可以看到安装页面。此步骤将会创建用于存储网站内容和设置的数据库。关于如何安装Orchard,见:原文:Install-Orchard译文:Orchard入门——安装Orchard

  2. 当前,作为用户,它也可以访问前台页面。

  3. 他们可以打开控制面板,可以进行如下两个操作:关于控制面板的内容夹:原文:Getting Around the Dashboard译文:Orchard入门——Orchard控制面板概览

    1. 配置网站:编辑网站的行为和外观设置(或安装/禁用/升级它们)。关于更多网站配置见:原文:Building Your First Orchard Site译文:Orchard入门——构建你的第一个Orchard网站

    1. 编辑网站内容。关于更多网站内容编辑见:原文:Building Your First Orchard Site译文:Orchard入门——构建你的第一个Orchard网站

  4. 使用命令行:可以通过命令行来管理脚本执行,这样就可以比较容易的处理自动化操作。关于更多命令行内容见:原文:Using the Command-Line Interface译文:Orchard网站管理——使用命令行界面

设计人员

设计者可以修改网站的外观,如原文:Previewing and Applying a Theme。他还可以编辑现有主题(如果提供)的设置,或创建一个新的主题。
在网站中,主题是用于控制网站整体的视觉呈现。它有时还叫做皮肤或模板。它将内容(用户产生的数据)转化为可以在浏览器中显示的html内容。例如:当你写了一篇博文,主题会定义菜单、标题、主体、评论等显示在什么位置以及如何显示。

设计者会依据需要定制到什么程度来修改主题的部分或所有元素,关于如何自定义主题内容见:原文:Customizing Themes译文:Orchard网站定制——定制主题。而主题中主要有以下类型:

  • 定义布局和区域的文档:这是网站页面的整体展示(不含有任何具体内容)。例如:它可以定义网站有1、2、3列。而区域则是布局内的一个部分,它是准备接收任何内容的一个容器。注意,一个灵活的主题(如Orchard提供的)可以自动隐藏空区域。因此,尽管下图显示了许多区域,但大部分区域不会显示在页面上 —— 由于他们没有被使用。

  • 视图——Views: 具体内容的可视化显示。一个视图界面通常是一个后缀为.CSHTML 或 .ASPX的文件。它为显示特定类型内容提供html代码。因此,一个含有很多内容的页面(菜单、博文、评论等)是由各个相关的单个视图组合后创建出来的。

  • 样式表——Stylesheets, Javascript 和媒体文件:它们用于修改视图显示的视觉定义。它们是一系列文件,如"Site.css", jQuery 或者背景图片,边框和图标。

  • 部件-Widget:一个网页通常含有一个主要内容(如博文),但常常还会在两边有小块的信息,如标签云、最近博文列表,twitter订阅等。更多部件内容见:原文:Managing Widgets译文:Orchard入门——部件管理

  • 层和特定区域之间的绑定:就像一组页面的描述。一旦定义,你可以控制每一个内容(或部件)显示在哪里。例如:我们可以为博文定义一个层组,然后在其一边添加一个标签云。

更高级的主题还可以通过编写代码来进一步定制外观显示。

开发人员

开发人员对Orchard架构有一个比较完整的了解,并可以扩展它。

Orchard是以模块组织的。每一个模块通过一个高级别的目标实现来为网站提供构建块(又叫附加或外挂)。例如,你可以有以下模块:

  • 扩展模块:为网站添加有用的功能(底层的)。如:添加搜索功能,详见:原文:Search and Indexing译文:Orchard网站内容管理——搜索与索引,或者添加外部编辑器(如Liver Writer)支持,详见:原文:Blogging with LiveWriter译文:Orchard网站内容管理——使用Live Writer写博客

  • 内容模块:为查看/编辑内容的类型(如博文)添加所需要的一切(代码和可视化)

  • 部件模块:在内容模块旁边添加小的可视化内容,如在博客边上添加标签云

  • 元素模块:在Orchard.Layouts模块中添加小的要包含的元素,这是让你的设计页面显示在浏览器中的核心模块。

  • 主题模块:改变已有的内容模块的外观。—— 这是设计师通常需要创建的模块。

  • 上面所有的集合:一个模块可以在一个包中含有多个扩展、内容类型、部件和主题。

Orchard采用了高度可扩展设计 —— 这意味着几乎所有你要交互的事都可以扩展,取代或禁用。
Orchard默认提供一系列的模块,为此可以提供给用户/管理员良好的体验,但是设计者/开发者可以修改他们,或者创建更多,关于如何创建模块见:原文:Getting Started with Modules。它还允许你共享你的模块到Orchard社区,或者安装有其他人开发的模块。更多内容见:原文:Packaging and Sharing a Module原文:Installing and Upgrading Modules

Orchard默认只附带一个主题 —— [The Theme Machine]。但是,它含有足够的区域供不同的安排,这非常重要,因为一个网站在一个时间上只能使用一个主题。这就意味着主题必须足够灵活以允许所有的页面使用不同的布局。如果它无法满足你,你可以拷贝它并添加更多区域。

Orchard Gallery中,含有大量的主题和模块以供安装。你可以通过浏览它并从中找到额外的可用功能。

内容

为了填充你的网站,Orchard允许你编辑和展示内容。在默认安装中,它含有创建页面和博文的功能。但是他也允许你定义自己的内容,这很重要,因为你可能需要创建事件或简介,或任何其他的内容,但在Orchard中是没有默认提供的。本节介绍了提供该功能的各种元素:

  • 内容——Content: 通常是网站前台页面显示的数据。可将它作为调用用户产生的任何东西的通用方式。

  • 内容类型和项目 —— Content Type & Item: 内容类型类似于动态类,它用于定义特殊类型内容的数据结构。结构可以被修改,管理员也可以修改结构。内容项是内容类型的一个实例。因此,BlogPost是一个内容类型,当你写了一篇博文,那篇博文就是一个内容项。

  • 内容块——Content Part: 因为内容类型共享许多方面,那些方面可以单独创建,也可以在每种内容类型中重复使用。如:一篇博文可能含有评论,一张照片也可以含有评论,因此,我们可以创建一个评论部分,并在两个内容类型中重用,这避免了在实现两次评论功能。

  • 内容字段——Content Field: 与内容块一样,为了可以重复使用,我们可能需要创建更小型的类型来处理必须要以某些方式表现的内容。例如:大部分内容类型包含日期、电话号码、电子邮件地址等。他们不是简单的属性,因为我们可以附加一些行为(如验证规则);他们也不是内容块,因为他们太“小”。

  • 记录——Record: 为了可以保存一个内容类型/部分(保存到SQL数据库),它需要关联到一条记录。它是一个类,且它的所有属性都需要保存。例如:Map部分必须保存它的坐标(纬度和经度),因此他会关联到一条含有两个属性的记录,然后Orchard会完成加载和保存的操作。你不许要自己处理记录,除非你开发自己的模块,但是在你遇到它时,理解本概念是有帮助的。关于更多开发模块见:原文:Getting Started with Modules

注意,在每个内容类型中,每个内容块最多只能有一个。但是在同一类型中含有多个字段。原因在于这些概念的语义含义。例如:一篇博文中只能有一个评论部分,但它可以有很多日期(创建日期、最后更新日期等)。

由于Orchard是开源项目,你可以自由贡献你想要的功能或模块。更多内容见:原文:Frequently Asked Questions原文:Contributing Patches

结语

至此,你应该对Orchard有一个比较好的理解。下一步将会更多的讨论模块、主题以及Orchard的底层架构。这在进行扩展开发之前是比较有用的。


译:奇葩史