网站建设经验做法和取得的成效,wordpress 浏览器兼容,旅游网站课程设计,地矿局网站建设方案2019独角兽企业重金招聘Python工程师标准 WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是《Visual Studio 版本转换工具WPF版开源了》的续#xff0c;关于《Visual Studio 版本转换工具WPF版开源了》可以参看地下地址#xff08;两篇是一样的#xff09; WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是《Visual Studio 版本转换工具WPF版开源了》的续关于《Visual Studio 版本转换工具WPF版开源了》可以参看地下地址两篇是一样的 开源中国 http://my.oschina.net/chinesedragon/blog/308336CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html 引言 前几一写了一个小工具————《Visual Studio版本转换工具》由于使用了WPF做为界面因此这个小程序运行必须附带两个DLLMicrosoft.Expression.Interactions.dll和System.Windows.Interactivity.dll同时由于自己也写了一个库一个小程序需要附带3个DLL这种体验真的很不爽于是就着手把DLL嵌入到EXE中去。 挫折 对于C#程序要把DLL嵌入到EXE中去最权威和最常见的方法就是使用ILMerge这个工具这是个命令行工具有很多参数可以将DLL很完美的嵌入到EXE中去如果嫌命令行麻烦也有人开源开发了图形界面ILMergeGUI这两个工具的下载和帮助地址如下 ILMerge http://www.microsoft.com/en-us/download/details.aspx?id17630ILMerge-GUI http://ilmergegui.codeplex.com/ 于是下载了这两个工具却出现将DLL嵌入到EXE中错误的情况在网上查了下原因竟然是ILMerge不支持WPF程序我勒了个去微软你让我说你什么好呢 ILMerge可以将Winform程序的DLL完美地嵌入到EXE中去这一点我亲自测试了下很不点赞但对WPF却不支持原因是WPF的DLL中含有资源无法解决微软你好意思说这个工具是你开发的吗Winform程序将DLL嵌入到EXE中一——使用命令行 ## 下载ILMerge或者同时下载ILMerge-GUI使用图形界面和使用命令行是同一个道理只是图形界面简单些所以这里以命令行说明。 我是下载ILMerge安装后把ILMerge.exe复制到C:\Windows目录下去了这样可以直接在命令行中使用而不用去设置环境变量不管怎样只要能够在命令行下使用这个工具就行。 ILMerge有很多参数其中有几个比较重要 /target:目标有library和Winexe两种选择当将多个DLL整合成一个DLL时可以使用library当要整合为EXE时应该使用Winexe./out:输出最终生成文件的路径和名称./log:输入如果输入是EXE时可以不使用此参数直接写而如果输入时DLL时最好使用此参数 还有其它一些参数使用时可以百度或者google一下这是我测试的一张图片Winform程序将DLL嵌入到EXE中二——使用ILMerge.MSBuild.Tasks ILMerge也使用Nuget发布了工具使用Nuget的好处想必大家都知道所以推荐使用这种方法。 第一步 使用Nuget图形或Nuget命令下载ILMerge.MSBuild.Tasks PM Install-Package ILMerge.MSBuild.Tasks 第二步 把VS项目文件记事本或者其它文本编辑工具打开我使用的是Sublime Text 3并按照如下格式根据实际情况修改 !-- Code to merge the assemblies into one:setup.exe --
UsingTask TaskNameILMerge.MSBuild.Tasks.ILMerge AssemblyFile$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll /
Target NameAfterBuild ItemGroupMergeAsm Include$(OutputPath)$(TargetFileName) /MergeAsm Include$(OutputPath)LIB1_To_MERGE.dll / !-- 这儿改成需要做嵌入的dll名 --MergeAsm Include$(OutputPath)LIB2_To_MERGE.dll //ItemGroupPropertyGroupMergedAssembly$(ProjectDir)$(OutDir)MERGED_ASSEMBLY_NAME.exe/MergedAssembly!-- 这儿改成需要做输出的exe名 --/PropertyGroupMessage TextILMerge (MergeAsm) -gt; $(MergedAssembly) Importancehigh /ILMerge InputAssemblies(MergeAsm) OutputFile$(MergedAssembly) TargetKindSameAsPrimaryAssembly /
/Target这样编译后就可以了。 WPF程序将DLL嵌入到EXE中一——将DLL自动转换为嵌入资源 第一步修改项目文件将DLL自动转换为嵌入资源。 把VS项目文件记事本或者其它文本编辑工具打开我使用的是Sublime Text 3并将下面内容添加到文件末尾 Target NameAfterResolveReferencesItemGroupEmbeddedResource Include(ReferenceCopyLocalPaths) Condition%(ReferenceCopyLocalPaths.Extension) .dllLogicalName%(ReferenceCopyLocalPaths.DestinationSubDirectory)%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)/LogicalName/EmbeddedResource/ItemGroup
/Target第二步修改App.xaml文件在程序启动时加载资源 public partial class App : Application
{private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args){Assembly executingAssembly Assembly.GetExecutingAssembly();var executingAssemblyName executingAssembly.GetName();var resName executingAssemblyName.Name .resources;AssemblyName assemblyName new AssemblyName(args.Name); string path ;if (resName assemblyName.Name){path executingAssemblyName.Name .g.resources; ;}else{path assemblyName.Name .dll;if (assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) false){path String.Format({0}\{1}, assemblyName.CultureInfo, path);}}using (Stream stream executingAssembly.GetManifestResourceStream(path)){if (stream null)return null;byte[] assemblyRawBytes new byte[stream.Length];stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);return Assembly.Load(assemblyRawBytes);}}protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);AppDomain.CurrentDomain.AssemblyResolve OnResolveAssembly;}
}第三步dll嵌入exe后目录中的dll就没用了配置Post buid 脚本自动删除dll: cd $(TargetDir)
del *.dll有些情况下以上方法也不行那么可以尝试 Eazfuscator.NET Eazfuscator.NET以前免费现在已经变成收费软件了不过找个免费的3.3版本也可以支持VS2010和VS2012 WPF程序将DLL嵌入到EXE中二——使用LibZ Container LibZ是ILMerge的另外一个选择它同样可以把DLL嵌入到EXE中去在我的测试中它可以完成WPF程序的DLL嵌入到EXE中去但好像这个组件使用的人不是很多。 LibZ Container的项目主页是http://libz.codeplex.com/ LibZ同样提供了Nuget下载使用Nuget有很多好处所以推荐使用这种方式。 使用Nuget图形或者命令下载LibZ.Bootstrap Install-Package LibZ.Bootstrap然后配置Post buid 脚本 set LIBZ$(SolutionDir)packages\LibZ.Bootstrap.1.1.0.2\tools\libz.exe
%LIBZ% inject-dll --assembly VSConverter.WPF.exe --include *.dll --move编译通过后就可以了。这里需要注意的是--assembly后的参数是项目生成的文件名. LibZ还有很多用法可以到项目文档学习。 参考资料 Combining multiple assemblies into a single EXE for a WPF applicationDLL嵌入exe中LibZ项目Nuget是个十分强大的工具使用Nuget在很多时候可以使解决方法变得简单给Nuget赞一个 再做下广告Visual Studio版本转换工具WPF版的代码托管地址是http://git.oschina.net/shupengluo/VSConverter欢迎交流。 最后再小小地鄙视下微软^_^ 转载于:https://my.oschina.net/chinesedragon/blog/309223