如何合并多个.NET程序集

   2015-06-27 0
核心提示:这篇文章主要介绍了如何合并多个 .NET 程序集的方法,大家可能都听说过项 ILMerge, SmartAssembly, 等这样的工具.但是我想如果我们就能通过在编译时将所有这些源代码文件导入一个项目,来获得这些东西的一个完美组合.下面我们就来仔细探讨下。

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

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

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

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

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

如何合并多个.NET程序集

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

如何合并多个.NET程序集

注意 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程序集

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

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

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

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

 
标签: 合并 .NET 程序集
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Java分析Lambda表达式Stream流合并分组内对象数
    目录前言需求代码实现依赖引入设计实体类测试代码前言之前写过《Lambda使用——JDK8新特性》,现在有一个分组合并的需求正好拿来小试牛刀。需求数据出自许多接口数据,需要将几个接口数据根据省份id进行分组合并。举例说明:A接口返回List里面有值的的字段为
  • lua字符串合并 lua字符串截取
    local a = 1local b = ","local c = 2local str = tostring(a)..tostring(b)..tostring(c)print(str)1,2
    02-09
  • R语言合并data.frame r语言合并字符串
    Adding ColumnsTo merge two data frames (datasets) horizontally,  use the merge function. In most cases, you join two data frames  by one or more common key variables (i.e., an inner join).# merge two data frames by ID   total - merge(dat
    02-09
  • R语言进行曲线/直线趋势线拟合并计算P值、添加
    8/26/2021 3:39:51 PM在对一些时间序列数据进行线性拟合的时候,最方便的是在Excel中添趋势线,同时显示公式与R值,但是我们需要对其进行P值计算以检验该趋势是否具有显著性,此外,置信区间也是一个需要考虑是否进行显示的问题。library(basicTrendline) lib
    02-09
  • TypeScript 素描 - 模块解析、声明合并
    模块解析有两种方式相对方式  也就是以/或 ./或…/开头的,比如import jq  from “/jq” 非相对方式  比如 import model  from “modelA” TypeScript的模块解析吸取了Node与Classic两种方式的好处并结合在一起 例如当前文件夹是  root/src/,其中a.ts导
    02-09
  • 转载:《TypeScript 中文入门教程》 11、声明合
    文章转载自:https://github.com/zhongsp建议您直接跳转到上面的网址查看最新版本。介绍TypeScript有一些独特的概念,有的是因为我们需要描述JavaScript***对象的类型发生了哪些变化。 这其中之一叫做声明合并。 理解了这个概念,对于你使用TypeScript去操作
    02-09
  • angular2^ typescript 将 文件和Json数据 合并
    nodejs 中使用框架 express web框架multer 文件接受直接贴代码了,我就不解释了 angular2^ typescript 将 文件和Json数据 合并发送到服务器(2.服务端)https://gitee.com/richard1015/node-server"use strict";exports.__esModule = true;var express = re
    02-09
  • TypeScript - 声明合并
    如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型:函数的合并:function reverse(x: number): number;function reverse(x: string): string;// 合并成function reverse(x: number | string): number | string {if (typeof x === 'number')
    02-09
  • NodeJs之文件合并(某一文件的内容发生变化与之
    首先,一个文件里面的内容是由多个文件共同组成的。例如一个文件夹包含有多文件(文件夹)然后,当其中一个发生变化时所用与之有直接作用的文件(文件夹)都会重新组合。/*注意:该例子需要在同级目录下完成及该脚本去监听另一个与之同目录下的文件,然后发生
    02-09
  • C#/VB.NET 合并PDF页面 cba
    C#/VB.NET 合并PDF页面 cba
    本文以C#及vb.net代码为例介绍如何来实现合并PDF页面内容。本文中的合并并非将两个文档简单合并为一个文档,而是将多个页面内容合并到一个页面,目的是减少页面上的空白区域,使页面布局更为紧凑、合理。下面,将分别从两个示例来展示合并,即:从两个PDF文档
    02-09
点击排行