C#:根据平台访问32位/ 64位DLL

时间:2010-03-04 10:33:37

标签: c# 64-bit pinvoke dllimport

我们使用来自C#应用程序的自编写32位C ++ DLL。现在我们注意到当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然也无法从64位运行时访问32位DLL。

我的问题是:有没有办法使用32位DLL?如果没有,如果我创建了64位版本的DLL,是否可以轻松地让应用程序选择哪一个进行P / Invoke?

我正在考虑在C#中创建两个辅助类:一个从32位DLL导入函数,另一个从64位DLL导入,然后为每个调用32位的导入函数创建一个包含一个函数的包装类导入程序或64位导入程序,具体取决于操作系统的“bittyness”。那会有用吗?

或者还有另一种简单的方法吗?

4 个答案:

答案 0 :(得分:6)

你需要确保在64位编译时只对64位DLL使用P / Invoke调用。

一种选择是将所有“方法”移动到标准接口(或抽象基类)中,并提供2个实现,一个32位和一个64位。您可以使用工厂方法根据IntPtr的大小构造类的相应实例。

这允许“AnyCPU”应用程序在运行时正确地确定要调用哪个DLL,并且确实有效。

答案 1 :(得分:3)

创建一个包装64位和32位DLLS的帮助程序类,并使用IntPtr.Size来确定要调用的内容。

if (IntPtr.Size == 8)
{
    Helper.SomeMethod64();
}
else
{
    Helper.SomeMethod32();
}

答案 2 :(得分:1)

您可以将.Net应用标记为仅定位到x86架构

答案 3 :(得分:1)

我有类似的问题,但是Unrar.dll是32或64位。

有两种方法可以使其发挥作用:

a)

#if x64
// ... define all x64 imports here
#else
// ... define all x86 imports here
#endif

编译32Bit和64bit的应用程序。

b)中 另一种方法是为导入创建接口,并分别实现32位和64位版本。

如果是32位,则实例化32位实现,否则实例化64位实现。