C# 和 PInvoke 到 32/64 位 DLL

C# and PInvoke into 32/64 bit DLL

我正在创建一个 class 库,我希望最终能将它放在 NuGet 上。现在,它的目标是 AnyCPU。

我现在想 PInvoke 到一个 DLL 中,它有 32 位和 64 位版本。最初,我以为我只使用 32 位版本,但这引发了 BadImageFormatException。我将库更改为仅针对 X86,虽然这有效,但它要求调用者也是 32 位进程。这自然不适用于 NuGet 项目。

感谢任何有关如何使用本机库的 32/64 位版本以及如何将其打包到 NuGet 中的想法(最好不要有 2 个不同的程序集)。

您可以在运行时检查平台并 PInvoke 到不同的 DLL。

static void NativeFuncWrapper(){
    if(Environment.Is64BitProcess){
        NativeFuncWrapper64(); //this calls 64-bit dll
    }else{
        NativeFuncWrapper32(); //this calls 32-bit dll
    }
}

如果您希望它在没有 Environment.Is64BitProcess 的情况下工作,请阅读 How to know a process is 32-bit or 64-bit programmatically 以了解替代方法。