当前位置: 首页 > 编程笔记 >

如何合并多个 .NET 程序集

公西翊歌
2023-03-14
本文向大家介绍如何合并多个 .NET 程序集,包括了如何合并多个 .NET 程序集的使用技巧和注意事项,需要的朋友参考一下

任何曾今寻找过一个将多个程序合并到一个文件中的解决方案的人,可能都听说过项 ILMerge, SmartAssembly, 等这样的工具.

另外一个知名的方案是将DLL作为资源进行嵌入(如果感兴趣,这里有一篇描述这一方案的精彩文章:从嵌入的资源出载入DLL[^]).

而在某些情况中,我意识到有必要使用这些方法.如果我们有了这些汇编的源代码,我们就能通过在编译时将所有这些源代码文件导入一个项目,来获得这些东西的一个完美组合.

在这里我将尝试对如何做到这件事进行简要的描述.

为了进行演示,让我们假设我们有一个控制台应用程序 (这是我们的主程序) ,引用并且使用了两个类库 (我们的二级程序),而我们想把它们组合成一个文件:

我们按照设想构建了这个解决方案,获取了这三个程序:

注意 MyExecutable 的项目文件 (MyExecutable.csproj)是一个基于XML的文件,而如果我们查看它的内容,会发现一些ItemGroup节点. 这些节点博阿含定义了构建过程输入的子元素. 这些子元素可以引用需要被编译的应用程序的资源文件, 或者是一些需要被复制的资源,以及需要在构建处理中被包含进去的程序集 (如果对此感兴趣,你可以在MSDN MSBuild上了解到更多有关Visual Studio项目文件的信息).

现在让我们定位到 ItemGroup 节点,里面引用了要被包含进来的程序集:

<ItemGroup>
  <ProjectReference Include="..\MyLibrary1\MyLibrary1.csproj">
    <Project>{ea53ca82-13d7-4be1-b95a-4d9d7853d46e}</Project>
    <Name>MyLibrary1</Name>
  </ProjectReference>
  <ProjectReference Include="..\MyLibrary2\MyLibrary2.csproj">
    <Project>{c31d21f3-e86a-4581-b4e8-acae6644d19e}</Project>
    <Name>MyLibrary2</Name>
  </ProjectReference>
</ItemGroup>

这里,我们将添加一个条件,指示在Debug模式中构建 MyExecutable 时要到MSBuild那里去使用这些项目引用:

<ItemGroupCondition="'$(Configuration)'=='Debug'">

而对于发布(Release)模式,我们将来自 MyLibrary1 和 MyLibrary2 的所有源代码文件都包含进来,也进行编译. 我们会利用一个通配符文("\**\*.cs")将目录及其子目录汇总所有的CS文件都包含进来. 通配符文也会将一些我们不想要的资源代码文件包含进来(obj文件夹中的TemporaryGeneratedFile_[guid].cs 以及Property文件夹中的AssemblyInfo.cs文件就是这种情况) 因此我们将对它们进行排除:

<ItemGroup Condition=" '$(Configuration)' == 'Release' ">
  <Compile Include="..\MyLibrary1\**\*.cs"
           Exclude="..\MyLibrary1\Properties\AssemblyInfo.cs;
                    ..\MyLibrary1\obj\**;
                    ..\MyLibrary1\bin\**">
    <Link>MyLibrary1\%(RecursiveDir)%(Filename)%(Extension)</Link>
    <Visible>false</Visible>
  </Compile>
  <Compile Include="..\MyLibrary2\**\*.cs"
           Exclude="..\MyLibrary2\Properties\AssemblyInfo.cs;
                    ..\MyLibrary2\obj\**;
                    ..\MyLibrary2\bin\**">
    <Link>MyLibrary2\%(RecursiveDir)%(Filename)%(Extension)</Link>
    <Visible>false</Visible>
  </Compile>
</ItemGroup>

这样就可以了,让我们保存 MyExecutable.csproj 中的修改,并在发布模式中对解决方案进行重新构建:

我想要强调的最后一件事情就是,因为我们是在形式上将所有的程序集源文件的编译移到一个项目中, 项目需要能够编译那些文件才行. 因此你需要考虑下面这些事情:

为了能构建成功,主程序需要有二级程序所有的引用,资源,设置等等.

所有的程序集都需要用同一种 .NET 语言编写.

以上就是本文所述的全部内容了,希望大家能够喜欢。

 类似资料:
  • 问题内容: 如何将其写成一行? 用id和class选择html标签的方法是什么? 问题答案: 您所要做的就是用逗号分隔它们,例如

  • 问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出

  • 问题内容: 我正在使用’Lucene.Net’库,并且有以下问题。 不是创建两个单独的QueryParser对象并使用它们来获得两个Hits对象,而是可以使用一个QueryParser对象在两个字段上进行搜索,这样我只有一个Hits对象,它可以为我提供每个文档的总体得分? 问题答案: 有3种方法可以做到这一点。 第一种方法是手动构造查询,这是QueryParser内部的工作。这是执行此操作最强大的

  • 问题内容: 供参考的是代码。我正在尝试制作一个记录到elasticsearch的hubot插件,然后使用hubot命令搜索那些日志。 https://gist.github.com/4050748 我正在尝试检索与两个查询匹配的记录。 我期待: 多达50条记录 具有给定用户的记录 最近一小时的记录 我有: 最多10条记录 具有给定用户的记录 从任何时候 我如何在过去一小时内获取带有某些用户名的所有

  • 本文向大家介绍如何用python合并多个excel文件,包括了如何用python合并多个excel文件的使用技巧和注意事项,需要的朋友参考一下 安装模块 1、找到对应的模块  http://www.python-excel.org/ 2、用 pip install 安装 因为使用的是 python3,所以安装的时候采用 pip3。 XlsxWriter 示例 先看看简单的演示: 运行结果如下: 合

  • 问题内容: 我有一个这样的表来保存体检的结果以及发送报告的日期和结果。实际上,发送的日期是基于临床访问日期。客户可以拥有一个或多个报告(日期可能有所不同) 我想从上述数据中提取以下报告。 我正在研究Postgresql。“交叉表”功能在这里无法使用,因为每个客户端的“ date_sent”不一致。 任何人都可以粗略地提出一个应如何查询的想法吗? 问题答案: 我建议采用以下方法: 它的输出格式不完全