使用exe编译非托管DLL

Sof*_*eit 4 .net c# compilation fody-costura

我正在尝试使用 costura fody 将一堆 DLL 嵌入到我的 C# 可执行文件中,但我在使用 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>
Run Code Online (Sandbox Code Playgroud)

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

我还尝试将 DLL 的“构建操作”更改为“嵌入式资源”,虽然可执行文件大小显着增加,但如果我启动程序时没有将 DLL 与 exe 放在同一文件夹中,则会出现运行时 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这次它留下了一个 System.BadImageFormatException,因为我认为这段代码仅适用于托管 DLL。

Sof*_*eit 9

我找到了解决办法!

显然,我需要做的就是在项目的根目录中创建文件夹 Costura32 和 Costura64,将 32 位和 64 位 DLL 放入各自的文件夹中,将其构建操作更改为“嵌入式资源”并使用我的原始文件进行编译服装设置。

这就是我的项目的样子:

解决方案资源管理器的屏幕截图

这是我的 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>
Run Code Online (Sandbox Code Playgroud)