使用exe编译非托管DLL

问题描述 投票:0回答:2

我试图使用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的“构建操作”更改为“嵌入式资源”,并且当可执行文件大小显着增加时,如果我在没有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);
        }
    }

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

c# .net compilation fody-costura
2个回答
1
投票

将文件作为“嵌入式资源”添加到项目中:

Embedded resource

然后保存到主程序集目录:

Assembly assembly = this.GetType().Assembly;
string assemblyLocation = System.IO.Path.GetDirectoryName(assembly.Location);

if (!System.IO.File.Exists(System.IO.Path.Combine(assemblyLocation, "libmp3lame.64.dll")))
{
    using (FileStream fileStream = new FileStream(assemblyLocation + "libmp3lame.64.dll", FileMode.CreateNew, FileAccess.Write, FileShare.None))
        assembly.GetManifestResourceStream("Client.libmp3lame.64.dll").CopyTo(fileStream);
}

COM dll无法加载到域中,您只需将其保存在应用程序根目录中。


0
投票

我找到了解决方案!

显然,我需要做的就是在我的项目的根目录中创建文件夹Costura32和Costura64,将32位和64位DLL放在各自的文件夹中,将其构建操作更改为“Embedded Resource”并使用我的原始编译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>
© www.soinside.com 2019 - 2024. All rights reserved.