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 以了解替代方法。
我正在创建一个 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 以了解替代方法。