使用exe编译非托管DLL

SofusØvretveit

我正在尝试使用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。

SofusØvretveit

我找到了解决方案!

显然,我要做的就是在项目的根目录中创建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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在非托管Delphi EXE中使用托管C#DLL吗?

在C#中使用非托管DLL

由非托管EXE引用时,托管DLL的App.Config

在C#项目中使用托管dll(使用非托管dll)

无法使用C#和Robert Giesecke的非托管导出工具创建非托管dll

NUnit C#使用DllImport的非托管dll引发BadImageFormatException

在C ++ / FORTRAN中使用非托管C#-DLL

在Linux(单声道)上使用混合模式(托管/非托管)dll

使用cl.exe将asm文件编译为dll

如何正确声明非托管 DLL 函数?

从非托管dll调用函数时出错

使用Mupen64Plus非托管C dll API命令填充C#结构

如何在 C++ 项目中使用非托管的 .dll、.lib、.exp

使用csproj在NuGet程序包中包含非托管DLL

使用 C 编译 DLL

不使用Visual Studio IDE将具有多个DLL文件的项目编译为单个EXE

无需DLL的Visual Studio托管C ++的编译解决方案

如何将非托管DLL和映像与托管DLL合并?

使用非托管代码的C#应用程序加载msvcr90.dll + msvcr80.dll + msvcr100.dll。这有关系吗?

在多项目解决方案中使用非托管DLL的VC ++项目在构建时会导致链接错误

如何使用从C ++到C#dll的非托管导出发送函数指针以用作回调

在Windows CE中从经典ASP调用非托管DLL

从非托管C#DLL返回列表/数组

P /调用-从C#调用非托管DLL

C-从非托管DLL正确导入stdcall函数

C#DLL异常未在非托管C ++中捕获

如何找出非托管dll的正确参数结构?

部署后,应用无法找到非托管dll

加载非托管 dll 而不将其写入磁盘