网站开发怎样将信息栏到最底部,广州网络营销选择,无锡高端网站建设机构,做暧视频免费网站我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源#xff08;不过好消息是现在开源了#xff09;#xff1b;后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。而本文介绍用来替代它们的 ILRepack#xff0c;使用 I… 我们有多种工具可以将程序集合并成为一个。比如 ILMerge、Mono.Merge。前者不可定制、运行缓慢、消耗资源不过好消息是现在开源了后者已被弃用、不受支持且基于旧版本的 Mono.Cecil。而本文介绍用来替代它们的 ILRepack使用 ILRepack 来合并程序集。ILRepack 提供了可供你项目使用的 NuGet 包。如果你在团队项目当中安装了 ILRepack 的 NuGet 包那么无论团队其他人是否安装了 ILRepack 的工具都可以使用 ILRepack 工具。这可以避免要求团队所有成员安装工具或者将工具内置到项目的源代码管理中。要以 NuGet 包的形式来使用 ILRepack需要首先安装 ILRepack 的 NuGet 包[NuGet GalleryILRepack](https://www.nuget.org/packages/ILRepack/)或者直接在你的项目的 csproj 文件中添加 PackageReference我现在有一个项目 Walterlv.Demo.AssemblyLoading这是一个控制台程序。这个程序引用了一个 NuGet 包 Ben.Demystifier。为此带来了三个额外的依赖。- Walterlv.Demo.AssemblyLoading.exe- Ben.Demystifier.dll- System.Collections.Immutable.dll- System.Reflection.Metadata.dll而我们可以使用 ILRepack 将这些依赖和我们生成的主程序合并成一个程序集这样分发程序的时候只需要一个程序集即可。那么我们现在需要编辑我们的项目文件 Project SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFrameworknet48/TargetFramework /PropertyGroup ItemGroup PackageReference IncludeBen.Demystifier Version0.1.4 / PackageReference IncludeILRepack Version2.0.17 / /ItemGroup Target NameILRepack Exec Commandquot;$(ILRepack)quot; /out:$(OutputPath)$(AssemblyName).exe $(OutputPath)$(AssemblyName).exe $(OutputPath)Ben.Demystifier.dll $(OutputPath)System.Collections.Immutable.dll $(OutputPath)System.Reflection.Metadata.dll / /Target /Project我们只增加了三行添加了一个名称为 ILRepack 的 Target。注意到项目文件中我有额外引用一个其他的 NuGet 包 Ben.Demystifier这是为了演示将依赖进行合并而添加的 NuGet 包具体是什么都没有关系我们只是在演示依赖的合并。在这个 Target 里面我们使用 Exec 的 Task 来执行 ILRepack 命令。具体这个命令代表的含义我们在下一节介绍 ILRepack 工具的时候会详细介绍。如果你希望在你的项目当中进行尝试可以把后面那些代表程序集的名称改为你自己项目中依赖程序集的名称。现在在编译的时候使用命令 msbuild /t:ILRepack 就可以完成程序集的合并了。注意你普通编译的话是不会进行 IL 合并的。如果你希望常规编译也可以进行 IL 合并或者说希望在 Visual Studio 里面点击生成按钮的时候也能完成 IL 合并的话那么你还需要增加一个跳板的编译目标 Target。我将这个名为 _ProjectRemoveDependencyFiles 的 Target 增加到了下面。它的目的是在 AfterBuild 这个编译目标完成之后AfterTargets执行然后执行前需要先执行DependsOnTargetsILRepack 这个 Target。在这个编译目标执行的时候还会将原本的三个依赖删除掉这样在生成的目录下我们将只会看到我们最终期望的程序集 Walterlv.Demo.AssemblyLoading.exe 而没有其他依赖程序集。 Project SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFrameworknet48/TargetFramework /PropertyGroup ItemGroup PackageReference IncludeBen.Demystifier Version0.1.4 / PackageReference IncludeILRepack Version2.0.17 / /ItemGroup Target NameILRepack Exec Commandquot;$(ILRepack)quot; /out:$(OutputPath)$(AssemblyName).exe $(OutputPath)$(AssemblyName).exe $(OutputPath)Ben.Demystifier.dll $(OutputPath)System.Collections.Immutable.dll $(OutputPath)System.Reflection.Metadata.dll / /Target Target Name_ProjectRemoveDependencyFiles AfterTargetsAfterBuild DependsOnTargetsILRepack ItemGroup _ProjectDependencyFile Include$(OutputPath)Ben.Demystifier.dll / _ProjectDependencyFile Include$(OutputPath)System.Collections.Immutable.dll / _ProjectDependencyFile Include$(OutputPath)System.Reflection.Metadata.dll / /ItemGroup Delete Files(_ProjectDependencyFile) / /Target /Project最终生成的输出目录下只有我们最终期望生成的程序集相比于 ILMergeILRepack 的命令行在尽量贴近 ILMerge 的情况下做得更加简化了。ilrepack /out:Walterlv.Demo.AssemblyLoading.exe Walterlv.Demo.AssemblyLoading.exe Ben.Demystifier.dll System.Collections.Immutable.dll System.Reflection.Metadata.dll其中/out 表示最终的输出程序集的名称或路径后面没有前缀的参数都是需要合并的程序集的名称或路径。这些需要合并的参数中第一个参数是主程序集而后续其他的都是待合并的程序集。区别主程序集和其他程序集的原因是输出的程序集需要有名称、版本号等等信息而这些信息将使用主程序集中的信息。如果希望使用 ILRepack 的其他命令可以考虑使用帮助命令或者直接访问 ILRepack 的 GitHub 仓库来查看用法gluck/il-repack: Open-source alternative to ILMerge如果你在使用 ILRepack 合并程序集的过程中出现了缺少依赖的错误例如下面这样Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: xxxxxxxxx那么你需要做以下两种事情中的任何一种将所有依赖合并将依赖加入搜索目录。将所有依赖合并指的是将缺少的依赖也一起作为命令行参数传入要合并的程序集中。而另一种是增加一个参数 /lib即添加一个被搜索的依赖程序集的目录。将这个目录指定后则可以正确解析依赖完成合并。而且这些依赖将成为合并后的程序集的依赖不会合并到程序集中。ilrepack /lib:D:\Dependencies /out:Walterlv.Demo.AssemblyLoading.exe Walterlv.Demo.AssemblyLoading.exe Ben.Demystifier.dll System.Collections.Immutable.dll System.Reflection.Metadata.dll参考资料gluck/il-repack: Open-source alternative to ILMerge原文地址https://blog.walterlv.com/post/merge-assemblies-using-ilrepack.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com