C# 通过Costura.Fody把DLL合并到exe程序中

打包独立的exe程序有多种方法,这里只说Costura.Fody。

我们用VS发布应用程序可以借助Costura.Fody直接打包成一个独立的exe程序,但是一些非托管的做了几次都没打进去,最后成功了,这里记录一下。

首先安装Costura.Fody

在这里插入图片描述
在这里插入图片描述

或者可以通过这里获取
https://github.com/Fody/Costura/tree/develop

我的版本是5.7.0安装好了后会自动生成FodyWeavers.xml

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
	<Costura>
	</Costura>
</Weavers>

具体的配置可以参考上面的官方下载

非托管DLL

我的项目中使用了UnRAR64一个解压缩的DLL,是C++的非托管DLL,在项目编译的时候Costura并不能自动把这个DLL打入exe。

[DllImport("unrar64.dll")]

总结我失败的原因,需要几个步骤:
1,把UnRAR64.dll设置成嵌入的资源
2,把这个文件复制到目录Costura64下
3,需要在xml里配置非托管的文件名

如图:
在这里插入图片描述

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
	<Costura>
		<Unmanaged64Assemblies>
			UnRAR64
		</Unmanaged64Assemblies>
	</Costura>
</Weavers>

小技巧

如何关闭Fody,有时候为了测试,我们可以屏蔽FodyWeavers.xml中的Costura,这样就失效了,例如:

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
	<!--<Costura>
		<Unmanaged64Assemblies>
			UnRAR64
		</Unmanaged64Assemblies>
	</Costura>-->
</Weavers>

补充:

新的6.0版本需要修改目录改为了
Costura-win-x64
Costura-win-x86

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
	<Costura IncludeRuntimeReferences="true" >
		<Unmanaged64Assemblies>
			UnRAR64
		</Unmanaged64Assemblies>
	</Costura>
</Weavers>

还有一些参数IncludeRuntimeReferences,可以把引用的NuGet包里的dll也打入exe

参考:
https://github.com/Fody/Costura/tree/develop
https://blog.youkuaiyun.com/qq_39200794/article/details/122146823

<think>嗯,用户想在C#项目中使用NuGet安装Costura.Fody,把OpenCvSharp的DLL嵌入到EXE文件中,并且兼容Any CPU平台。首先,我得回忆一下Costura.Fody的作用,它应该是用来合并DLLEXE里的,这样发布的时候就不需要带一堆DLL文件了。用户提到OpenCvSharp,这可能涉及到本地库的问题,比如OpenCvSharp依赖的本地DLL,比如opencv_worldXXX.dll,这些可能需要特别处理,因为Costura.Fody默认可能不会处理这些非托管的DLL。 接下来是安装步骤。用户给的参考里提到通过NuGet安装Costura.FodyFody。我需要确认是否需要同时安装这两个包。通常Fody是一个框架,而Costura.Fody是它的一个插件,所以两者都需要安装。安装之后,可能需要配置FodyWeavers.xml文件,确保Costura配置正确。 然后是关于Any CPU平台的问题。OpenCvSharp可能有不同的版本对应x86和x64,如果项目设置为Any CPU,在运行时可能会根据系统选择加载对应的本地DLL。但用Costura.Fody合并托管DLL没问题,但非托管的DLL可能需要手动处理。这时候可能需要使用Costura的配置选项,比如IncludeAssemblies或者Unmanaged32/64,来包含这些本地DLL,并设置运行时解压到临时目录。 用户可能遇到的问题包括:合并后运行时找不到OpenCvSharp的依赖DLL,或者Any CPU下无法正确加载对应的x86/x64版本。这时候需要检查Costura的配置,可能需要将非托管DLL作为资源嵌入,并在运行时复制到合适的位置。例如,在FodyWeavers.xml中添加配置,指定IncludeAssemblies和Unmanaged32Assemblies、Unmanaged64Assemblies,或者使用预处理指令根据平台复制不同的DLL。 另外,可能需要确保项目文件中的Copy Local属性设置为True,这样Costura才能正确捕获这些依赖项。对于OpenCvSharp4,可能需要额外安装OpenCvSharp4.runtime.win包来获取对应的运行时DLL,并确保它们被包含在项目中作为内容文件,这样Costura才能打包它们。 最后,测试的时候需要注意,如果在VS中调试,可能需要禁用Visual Studio的宿主进程(在项目属性->调试->启用本地代码调试),避免因为DLL被锁定导致的问题。同时,发布后的EXE文件需要检查是否包含了所有必要的依赖,并在不同平台上测试运行是否正常。</think>在C#项目中通过NuGet安装Costura.Fody实现DLL合并EXE文件的具体步骤如下: ### 一、安装Costura.Fody 1. 打开Visual Studio,依次选择: - 菜单栏"工具" → "NuGet包管理器" → "管理解决方案的NuGet程序包" - 在"浏览"选项卡搜索栏输入`Costura.Fody`和`Fody` - 选中`Costura.Fody`后,在右侧勾选需要配置的项目,点击"安装"[^1] 2. 验证安装结果: - 项目引用中会自动添加`Fody`和`Costura.Fody` - 项目根目录生成`FodyWeavers.xml`配置文件 ### 二、配置OpenCvSharp的AnyCPU支持 1. 安装OpenCvSharp4的AnyCPU版本: ```bash Install-Package OpenCvSharp4 Install-Package OpenCvSharp4.runtime.win ``` 2. 修改`FodyWeavers.xml`配置文件: ```xml <Weavers> <Costura> <IncludeAssemblies> OpenCvSharp* </IncludeAssemblies> <Unmanaged32Assemblies> opencv_world412 </Unmanaged32Assemblies> <Unmanaged64Assemblies> opencv_world412 </Unmanaged64Assemblies> </Costura> </Weavers> ``` ### 三、关键配置说明 1. **AnyCPU平台兼容**: - 在项目属性中设置目标平台为`Any CPU` - 通过`OpenCvSharp4.runtime.win`自动处理x86/x64依赖 - 使用条件编译指令处理不同架构: ```csharp #if DEBUG NativeLibrary.Load("opencv_world412d"); #else NativeLibrary.Load("opencv_world412"); #endif ``` 2. **DLL嵌入验证**: - 构建后检查输出目录应仅包含单个EXE文件 - 使用ILSpy工具验证嵌入的DLL资源 ### 四、常见问题解决方案 | 问题现象 | 解决方案 | |---------|----------| | 运行时提示丢失DLL | 检查`FodyWeavers.xml`的Include规则是否匹配 | | 无法加载非托管DLL | 确认已安装`OpenCvSharp4.runtime.win`包 | | AnyCPU平台崩溃 | 在app.config添加`<useLegacyV2RuntimeActivationPolicy="true"/>` |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值