常见项目默认编译后文件夹中有多个文件,缺少一个就可能运行错误。使用Costura.Fody后可以编译成一个dll文件或者一个exe执行文件,将所有内容合并到一起。
1、在项目中使用NuGet添加依赖:Costura.Fody和Fody
添加后生成的项目dll文件会增大很多,就是使用这个库合一的
2、项目根目录下会自动生成FodyWeavers.xml文件,没有则手动添加,基础内容如下,详细配置后面介绍
<Weavers>
<Costura/>
</Weavers>
# 我的为
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceS>
<Costura />
</Weavers>
3、配置加载顺序(可能不按预期顺序加载,导致依赖项无法正常初始化)
# 包含顺序内容以换行分隔
<Costura>
<PreloadOrder>
Foo
Bar
</PreloadOrder>
</Costura>
# 或使用属性配置,用|分隔资源名称
<Costura PreloadOrder='Foo|Bar' />
4、在测试中代码添加对应函数,如在构造函数或main起始添加
CosturaUtility.Initialize();
5、如果你有特定的文件或文件夹需要包含,可以在 FodyWeavers.xml 文件中进行配置
- IncludeAssemblies 用于指定要包含的特定程序集。
- ExcludeAssemblies不引用
- Unmanaged32Assemblies 和 Unmanaged64Assemblies 用于指定未托管的 DLL 文件。
- Content 部分用于指定要包含的文件和文件夹
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura>
<IncludeAssemblies>
MyLibrary.dll
</IncludeAssemblies>
<Unmanaged32Assemblies>
x86\MyUnmanagedLibrary.dll
</Unmanaged32Assemblies>
<Unmanaged64Assemblies>
x64\MyUnmanagedLibrary.dll
</Unmanaged64Assemblies>
<Content>
<Files>
<File>
<Path>Resources\MyResourceFile.txt</Path>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</File>
</Files>
</Content>
</Costura>
</Weavers>
6、包含指定目录多个文件
<Files>
<File>
<Path>Debug\*</Path>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</File>
<File>
<Path>Release\*.dll</Path>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</File>
</Files>
7、包含xml等配置文件到项目中
1)新建文件夹Costura32和Costura64,将debug中的文件全部拷贝到这里
2)项目》显示所有文件》显示没包含到项目中的文件夹后,鼠标点击后右键》包括在项目中
3)在FodyWeavers.xml文件夹中添加IncludeAssemblies配置要包含的文件目录
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=">
<Costura>
<IncludeAssemblies>
<Assembly Name="Costura32\*" />
<!-- 明确指定 Opc.UaFx.Advanced 程序集 -->
<Assembly Name="..\packages\Opc.UaFx.Advanced.2.33.0\lib\net471" />
<!-- Opc.UaFx.Advanced -->
</IncludeAssemblies>
</Costura>
</Weavers>
使用这个生成的库只能调用该库中提供的函数,我在里面引用了opc服务的库,在外部是无法正常引用的,需要单独引用,类似于只提供对外独立接口,减少打包资源