gpt4 book ai didi

c# - 目标 32 位或 64 位 native DLL,具体取决于环境

转载 作者:太空狗 更新时间:2023-10-30 00:31:44 29 4
gpt4 key购买 nike

我有一个 native DLL,它有 32 位和 64 位版本 (x86)。我想创建一个适用于两种架构(任何 CPU)的包装器,并根据当前环境(32 位或 64 位,在运行时!)加载正确版本的 DLL。这个过程应该自动发生,这样我的 DLL 的用户就不需要针对特定​​的体系结构。

有没有关于如何做到这一点的最佳实践?有什么可以指导我的例子吗?

我找到了一种可能的解决方案,它为每个体系结构使用托管代理,然后使用 Assembly.Resolve 事件加载正确的版本。然而,这要求我除了 2 个非托管库之外还有 3 个托管程序集,这似乎有点过分了。

还有其他解决办法吗?

最佳答案

这是我在许多项目中使用的解决方案:

  • 用“面向 32 位的名称”命名 32 位程序集。为了示例 MyAssembly.Native.x86.dll
  • 用“面向 64 位的名称”命名 64 位程序集。例如 MyAssembly.Native.x64.dll
  • 将托管程序集编译为“任何 Cpu”
  • 以相同的路径运送所有东西

下面是我声明 P/Invoke 方法的方式:

[DllImport("MyAssembly.Native.x86.dll", EntryPoint = "MyTest")]
private static extern void MyTest86(MyType myArg);

[DllImport("MyAssembly.Native.x64.dll", EntryPoint = "MyTest")]
private static extern void MyTest64(MyType myArg);

这里是相应的“MyTest”函数,我将一直使用它(其他函数在这里只是为了正确的位数绑定(bind))。它与其他 P/Invoke 具有相同的签名:

public static void MyTest(MyType myArg)
{
if (IntPtr.Size == 8)
{
MyTest64(myArg);
return;
}

MyTest86(myArg);
}

优点是:

  • 您可以将所有二进制文件(DLL、EXE 等)发送到同一路径
  • 您支持具有相同文件布局的 32 位和 64 位进程和操作系统
  • 您不必求助于 Win32 api 来更改 dll 加载路径

不便之处在于:

  • 对于 1 个“真实”方法,您将有 3 个方法声明
  • 由于位数测试,您将失去一些 CPU 周期
  • 根据您的上下文,有时您无法更改 native DLL 名称,所以您不能这样做

关于c# - 目标 32 位或 64 位 native DLL,具体取决于环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23215518/

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