最近有個客戶端項目用到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=".\obj\Release\$(TargetFileName)" DestinationFiles=".\obj\Release\$(TargetName).temp$(TargetExt)" /> 10 <SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SolutionDir)\Build\$(TargetName).saproj" OverwriteAssembly="True" /> 11 </Target> 12 </Project>
然后創建混淆項目,我這里要對三個程序集進行混淆,所以我建了三個項目,最終所有文件如下:
最后以XML方式打開各項目的csproj文件,在最下面加入如下代碼:
<Import Project="$(SolutionDir)\Build\SmartAssembly.targets" />
可能有人會問,為什么同樣都加這么一段話就可以對各個項目進行混淆,其實仔細看SmartAssembly.targets這個文件,里面有這么一段:
<SmartAssembly.MSBuild.Tasks.Build ProjectFile="$(SolutionDir)\Build\$(TargetName).saproj" OverwriteAssembly="True" />
這里讀取混淆項目(.saproj)文件時,是根據當前程序集項目名稱去找的,也就是 $(SolutionDir)\Build\$(TargetName)
所以這樣每個程序集項目生成的時候就會分別讀取各自的混淆項目文件,然后對各自的程序集進行加密了^_^!
這是擼主第一篇自創博文,可能寫的不是很清晰,希望大家多多指正!
相關下載: