我正在尝试使用costura fody将一堆DLL嵌入我的C#可执行文件中,但是我在使用2个DLL时遇到了一些麻烦。我正在使用NAudio库和NAudio.Lame库,虽然两个DLL都可以完美地编译到exe中,但NAudio.Lame包中添加了dlls“ libmp3lame.64.dll”和“ libmp3lame.32.dll”。无法使用exe进行编译。我尝试在Costura节点下的FodyWeavers.xml文件中添加以下内容:
<Unmanaged32Assemblies>
libmp3lame.32
</Unmanaged32Assemblies>
<Unmanaged64Assemblies>
libmp3lame.64
</Unmanaged64Assemblies>
XML不会更改exe的文件大小,因此我认为它没有执行任何操作。
我还尝试将DLL的“生成操作”更改为“嵌入式资源”,并且尽管可执行文件的大小显着增加,但是如果我在没有与exe相同的文件夹中启动DLL的情况下启动程序,则会得到运行时DLLNotFoundExeption。
编辑:我现在注意到,我只需要64位dll即可在我的计算机上运行该程序,但是我无法仅添加该dll
EDIT2:我尝试使用以下代码为AssemblyResolve设置事件:
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Client.libmp3lame.64.dll")) {
byte[] assemblyData = new byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
}
这次它留下了System.BadImageFormatException,因为我认为这段代码仅适用于托管DLL。
我找到了解决方案!
显然,我要做的就是在项目的根目录中创建Costura32和Costura64文件夹,将32位和64位DLL放入各自的文件夹中,将其生成操作更改为“ Embedded Resource”,然后使用原始文件进行编译Costura设置。
这是我的项目的外观:
这是我的FodyWeavers.xml:
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<IncludeAssemblies>
NAudio
NAudio.Lame
</IncludeAssemblies>
<Unmanaged32Assemblies>
libmp3lame.32
</Unmanaged32Assemblies>
<Unmanaged64Assemblies>
libmp3lame.64
</Unmanaged64Assemblies>
</Costura>
</Weavers>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句