gpt4 book ai didi

c# - 使用 exe 编译非托管 DLL

转载 作者:行者123 更新时间:2023-12-02 14:57:29 28 4
gpt4 key购买 nike

我正在尝试使用 costura fody 在我的 C# 可执行文件中嵌入一堆 DLL,但我在使用 2 个 DLL 时遇到了一些问题。我正在使用 NAudio 库和 NAudio.Lame 库,虽然两个 DLL 都可以完美地编译到 exe 中,但 NAudio.Lame 包添加了 dll“libmp3lame.64.dll”和“libmp3lame.32.dll”,我是无法用exe编译。我尝试在 Costura 节点下的 FodyWeavers.xml 文件中添加以下内容:

<Unmanaged32Assemblies>
libmp3lame.32
</Unmanaged32Assemblies>
<Unmanaged64Assemblies>
libmp3lame.64
</Unmanaged64Assemblies>

XML 不会更改 exe 的文件大小,因此我认为它什么也没做。

我还尝试将 DLL 的“Build Action”更改为“Embedded Resource”,虽然可执行文件的大小显着增加,但如果我在与 DLL 相同的文件夹中启动没有 DLL 的程序,我会得到一个运行时 DLLNotFoundExeption exe.

编辑:我现在注意到我只需要 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 放入它们各自的文件夹中,将它们的构建操作更改为“嵌入式资源”并编译使用我原来的 Costura 设置。

这是我的项目的样子:

Screenshot ofsolution explorer

这是我的 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>

关于c# - 使用 exe 编译非托管 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272107/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com