最近有个客户端项目用到ClickOnce发布,用它主要也是因为它能检测并自动安装framework,而且也能自动更新。
后来由于项目需要,领导要求对程序进行加密处理,我们也当然照办了,于是找来了SmartAssembly,找到发布后的程序集是这样子的
使用ClickOne发布后程序集都是.deploy后缀的,那么只要把要加密的程序集改回dll,然后放到SmartAssembly里面进行混淆处理后再改回去,是不是就可以了呢?
答案是NO
因为这样做了之后自动更新就会异常,具体原因不明,不过根据个人推测好像是ClickOne对程序集做了Hash校验,混淆后的程序集文件改变了文件的hash值导致ClickOne校验失败而无法更新,也就是说你要在程序发布前就要先混淆。。。
SmartAssembly专注混淆20年,好用还有破解版,关键是还支持MsBuild(注意:此处运用夸张手法,请大家不必在意)
于是根据SmartAssembly的官方文档,链接如下
http://documentation.red-gate.com/display/SA6/Using+SmartAssembly+with+ClickOnce+and+MSI
根据官方文档,我们创建一个SmartAssembly.targets文件,内容如下:
1 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 <UsingTask TaskName="SmartAssembly.MSBuild.Tasks.Build" AssemblyName="SmartAssembly.MSBuild.Tasks, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7f465a1c156d4d57" /> 3 <Target Name="BeforeBuild" Condition=" '$(Configuration)' == 'Release' "> 4 <CreateProperty Value="true"> 5 <Output TaskParameter="Value" PropertyName="RunSmartAssembly" /> 6 </CreateProperty> 7 </Target> 8 <Target Name="AfterCompile" Condition=" '$(RunSmartAssembly)' != '' "> 9 <Copy SourceFiles=".objRelease$(TargetFileName)" DestinationFiles=".objRelease$(TargetName).temp$(TargetExt)" /> 10 <SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SolutionDir)Build$(TargetName).saproj" OverwriteAssembly="True" /> 11 </Target> 12 </Project>
然后创建混淆项目,我这里要对三个程序集进行混淆,所以我建了三个项目,最终所有文件如下:
最后以XML方式打开各项目的csproj文件,在最下面加入如下代码:
<Import Project="$(SolutionDir)BuildSmartAssembly.targets" />
可能有人会问,为什么同样都加这么一段话就可以对各个项目进行混淆,其实仔细看SmartAssembly.targets这个文件,里面有这么一段:
<SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SolutionDir)Build$(TargetName).saproj" OverwriteAssembly="True" />
这里读取混淆项目(.saproj)文件时,是根据当前程序集项目名称去找的,也就是 $(SolutionDir)Build$(TargetName)
所以这样每个程序集项目生成的时候就会分别读取各自的混淆项目文件,然后对各自的程序集进行加密了^_^!
这是撸主第一篇自创博文,可能写的不是很清晰,希望大家多多指正!
相关下载: