.NET 合并程序集(将 dll 合并到 exe 中)

本文详细介绍了如何通过NuGet安装并配置Costura.Fody,实现DLL自动打包到EXE中,以及如何调整FodyWeavers.xml中的各种选项,如压缩、预加载顺序等,以优化.NET应用程序的性能和资源管理。
摘要由CSDN通过智能技术生成

1.第一步:通过 NuGet 安装 Costura.FodyFody

在这里插入图片描述

再添加一个Newtonsoft.Json的包测试
在这里插入图片描述

项目重新生成后 DLL自动打包到EXE里

在这里插入图片描述

根目录自动创建 FodyWeavers.xml 文件

在这里插入图片描述

2.FodyWeavers.xml配置文件

FodyWeavers.xml是配置文件,通过修改CosturaFodyWeavers.xml 中的节点来访问所有配置选项,默认配置如下,

<Weavers>
  <Costura/></Weavers>

1)CreateTemporaryAssemblies

将嵌入的文件复制到磁盘,然后再将它们加载到内存中。对于要从物理文件加载程序集的某些场景很有用。默认为false。

<Costura CreateTemporaryAssemblies='true' />

2)IncludeDebugSymbols

配置是否还嵌入引用程序集的.pdb文件,默认为true。

<Costura IncludeDebugSymbols='false' />

3)IncludeRuntimeReferences

配置.NET Core所使用的内嵌依赖项的运行时文件夹是否被内嵌。默认为true。

<Costura IncludeRuntimeReferences='false' />

4)UseRuntimeReferencePaths

配置运行时程序集是嵌入其完整路径还是只嵌入其程序集名称。.NET Framework项目默认为false,.NET Core项目默认为true。

<Costura UseRuntimeReferencePaths='true' />

5)DisableCompression

默认情况下,嵌入式程序集是压缩的,加载时则不压缩。可以使用此选项关闭压缩。

<Costura DisableCompression='true' />

6)DisableCleanup

作为Costura的一部分,嵌入式组件不再包含在构建中。这种Cleanup可以关闭。默认为false。

<Costura DisableCleanup='true' />

7)LoadAtModuleInit

默认情况下,Costura将作为模块初始化的一部分加载。该选项禁用该行为。确保在代码的某个地方调用了CosturaUtility.Initialize()。默认为true。

<Costura LoadAtModuleInit='false' />

8)IgnoreSatelliteAssemblies

默认情况下,Costura将使用名为’resources.dll’的程序集作为附属资源,并将输出路径放在前面。该配置项禁用该行为。

DLL项目程序集名称以’.resources’结尾,当设置为false时,*.resources.dll将导致错误。默认为false,配置如下,

<Costura IgnoreSatelliteAssemblies='true' />

9)ExcludeAssemblies / ExcludeRuntimeAssemblies

要从默认操作 “嵌入所有复制本地引用” 中排除的程序集名称列表。

不要在名称中包含.exe或.dll。

不能用IncludeAssemblies定义。

可以对部分程序集名称匹配使用通配符。例如,System.将排除所有以System.开头的程序集。通配符只能在条目的末尾使用,因此,例如,System..Private.*将不起作用。

可以使用多行配置:

<Costura>
  <ExcludeAssemblies>
    Foo
    Bar  
    </ExcludeAssemblies>
</Costura>

或者配置在一行使用|分隔,如下,

<Costura ExcludeAssemblies='Foo|Bar' />

10)IncludeAssemblies / IncludeRuntimeAssemblies

从默认操作“嵌入所有复制本地引用”中包含的程序集名称列表。

不要在名称中包含.exe或.dll。

不能用ExcludeAssemblies / incluuntimeassemblies定义。

可以在名称的末尾使用通配符进行部分匹配。

可以使用多行配置:

<Costura>
  <IncludeAssemblies>
    Foo
    Bar  </IncludeAssemblies></Costura>

或者配置在一行使用|分隔,如下,

<Costura IncludeAssemblies='Foo|Bar' />

10)Unmanaged32AssembliesUnmanaged64Assemblies

不能以与托管程序集相同的方式加载非托管程序集。

为了帮助Costura识别哪些程序集是Mixed-mode,以及在什么环境中加载它们,应该将它们的名称包含在一个或两个列表中。

不要在名称中包含.exe或.dll。

可以在名称的末尾使用通配符进行部分匹配。

可以使用多行配置:

<Costura>
  <Unmanaged32Assemblies>
    Foo32
    Bar32  </Unmanaged32Assemblies>
  <Unmanaged64Assemblies>
    Foo64
    Bar64  </Unmanaged64Assemblies></Costura>

或者配置在一行使用|分隔,如下,

<Costura
    Unmanaged32Assemblies='Foo32|Bar32' 
    Unmanaged64Assemblies='Foo64|Bar64' />

3、配置预加载程序集顺序

Costura可以自动加载本地库。要包含本机库,请将其作为嵌入式资源包含在项目中称为costura32costura64的文件夹中,这取决于库的bittyness

还可以选择指定预加载库的加载顺序。当从磁盘混合模式使用临时程序集时,程序集也会被预加载。

要指定预加载程序集的顺序,请向配置中添加PreloadOrder元素。

可以使用多行配置:

<Costura>
  <PreloadOrder>
    Foo
    Bar  </PreloadOrder></Costura>

或者配置在一行使用|分隔,如下,

<Costura PreloadOrder='Foo|Bar' />

4、CosturaUtility

CosturaUtility是一个类,它允许在自己的代码中手动初始化Costura系统。主要用于模块初始化器不起作用的场景,比如库和Mono

要使用,请在代码中尽可能早地调用CosturaUtility.Initialize()。例如,

class Program
{
    static Program()
    {
        CosturaUtility.Initialize();
    }

    static void Main(string[] args) { ... }
}

5、单元测试框架

大多数单元测试框架需要.dll文件来发现和执行单元测试。可能需要将如下配置添加到测试组件中。

<Weavers>
    <Costura ExcludeAssemblies='TargetExe|TargetExeTest'
             CreateTemporaryAssemblies='true'
             DisableCleanup='true'/></Weavers>

6、读取Costura.Fody内嵌压缩的程序集

合成之后被压缩的程序集需要读取,可以参考如下代码,

using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp1 
{
	class Program 
	{
		static void CopyTo(Stream source, Stream destination) 
		{
			int count;
			var array = new byte[81920];
			while ((count = source.Read(array, 0, array.Length)) != 0) 
			{
				destination.Write(array, 0, count);
			}
		}
		static Stream LoadStream(string fullname) 
		{
			FileStream stream = default(FileStream);
			if (fullname.EndsWith(".zip")) 
			{
				using (stream = new FileStream(fullname, FileMode.Open)) 
				{
					using (var compressStream = new DeflateStream(stream, CompressionMode.Decompress)) 
					{
						var memStream = new MemoryStream();
						CopyTo(compressStream, memStream);
						memStream.Position = 0;
						return memStream;
					}
				}
			}
			return stream;
		}
		static void Main(string[] args) 
		{
			Stream stream;
			Stream file;
			string RefilePath = @"^.+[^\\]+\\";
			string fullname;
			string newFile;
			for (int i = 0; i < args.Count(); i++) 
			{
				fullname = args[i];
				newFile = Regex.Replace(fullname, "\\.zip$", string.Empty);
				Console.Write("{0} -> {1}\r\n",
				          Regex.Replace(fullname, RefilePath, string.Empty),
				          Regex.Replace(newFile, RefilePath, string.Empty));
				try 
				{
					stream = LoadStream(fullname);
					using (file = File.Create(newFile)) 
					{
						CopyTo(stream, file);
					}
				}
				catch (Exception ex) 
				{
					Console.Write("{0}", ex.ToString());
				}
			}
		}
	}
}

注意:如果其它静态的资源文件,可以在VS中文件属性"生成操作" 选择 “Resource”,然后在读取资源文件。

### 回答1: 将.NET DLLEXE合并是一种将DLL(动态链接库)和EXE(可执行文件)文件进行合并的技术。这种合并可以实现.NET应用程序的简化和优化。 通过合并DLLEXE文件,可以将应用程序的所有依赖项包含在一个单独的可执行文件,而不需要额外的DLL文件。这种合并有以下几个优点: 1. 简化部署:合并后的文件可以更容易地进行部署和分发,因为只需要一个文件即可。 2. 提高性能:合并后的文件可以减少程序的启动时间和加载时间,因为不再需要在运行时从外部DLL加载代码和资源。 3. 防止依赖关系冲突:合并后的文件可以避免由于不同版本的DLL之间存在冲突而导致的问题。所有必需的代码和资源都包含在一个文件,可以确保它们之间的兼容性。 4. 保护源代码:合并后的文件可以更好地保护.NET应用程序的源代码,因为它们将不再以可访问的DLL形式存在。 要实现DLLEXE合并,可以使用一些工具或技术,如ILMerge、Costura.Fody等。这些工具可以将DLLEXE文件合并成一个单独的可执行文件。可以在构建过程使用这些工具,或者手动执行它们来完成合并操作。 总而言之,将.NET DLLEXE合并可以简化部署,提高性能,避免依赖关系冲突,并保护源代码。这是一个优化和改进.NET应用程序的有效方法。 ### 回答2: 将.NET DLLEXE合并是指将DLL文件与EXE文件合并为一个单独的可执行文件。这种操作主要有两个目的:减少文件数量和简化部署过程。 首先,通过将DLLEXE合并为一个文件,可以减少文件数量。原本,一个应用程序可能需要依赖多个DLL文件才能正常运行,这样就导致了文件过多的问题,给文件的管理和部署带来了一定的困扰。而将DLLEXE合并为一个文件后,就避免了这个问题,只需要一个文件就能完整地运行应用程序,简化了文件的管理和维护。 其次,将DLLEXE合并为一个文件还能简化部署过程。在原本的情况下,需要将DLL文件与EXE文件分开部署,并且还需要将DLL文件正确地放置在应用程序的搜索路径,否则应用程序无法找到所需的DLL文件,导致运行失败。而合并后的文件就不存在这个问题,只需要将一个文件部署到目标系统即可,无需额外的配置和指定搜索路径。 但需要注意的是,合并DLLEXE也有一些潜在的问题。首先,合并后的文件体积会比原来的文件大,这会增加程序的加载时间和磁盘占用空间。其次,如果需要更新DLL文件,合并后的文件就需要重新打包和部署,而不像原来的方式只需要替换对应的DLL文件即可。 综上所述,将.NET DLLEXE合并为一个文件可以减少文件数量和简化部署过程,但也带来了一些潜在的问题需要考虑。根据具体情况,可以选择是否进行合并。 ### 回答3: 将.NETdll(动态链接库)和exe(可执行文件)合并是通过使用ILMerge工具来实现的。ILMerge是一个独立的命令行工具,用于将多个.NET程序合并为单个程序。 使用ILMerge合并dllexe可以有以下几个好处: 1. 减少部署的文件数量:将多个dll合并为一个dll,或者将多个dllexe合并为一个exe,可以减少需要部署的文件数量,简化部署过程。 2. 提高应用程序的运行效率:合并dllexe可以减少程序的加载时间和启动时间,提高应用程序的运行效率。 3. 避免版本冲突:将不同版本的dll合并为一个程序,可以避免版本冲突问题,确保程序能够正确加载所需的函数和方法。 4. 保护源代码:合并dllexe可以将源代码打包到一个文件,使得源代码不容易被反编译或者修改。 使用ILMerge合并dllexe的步骤如下: 1. 下载并安装ILMerge工具。 2. 打开命令行工具,进入到ILMerge的安装目录。 3. 使用以下命令进行合并操作: `ILMerge.exe /out:MergedAssembly.exe PrimaryAssembly.exe SecondaryAssembly.dll` 其,MergedAssembly.exe合并后生成的新的exe文件名,PrimaryAssembly.exe是主程序的文件名,SecondaryAssembly.dll是次要程序的文件名。 4. 执行命令后,ILMerge将会合并指定的程序,生成一个新的exe文件。 5. 使用合并后的新的exe文件进行部署和运行。 需要注意的是,合并dllexe可能会导致一些依赖关系和引用路径的问题,因此在进行合并操作前,需要仔细检查和解决这些问题,确保程序能够正确运行。此外,合并dllexe可能会使得调试和更新程序变得更加困难,因此在合并前需要权衡利弊,选择合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值