我们使用来自C#应用程序的自编写32位C ++ DLL。现在我们注意到当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然也无法从64位运行时访问32位DLL。
我的问题是:有没有办法使用32位DLL?如果没有,如果我创建了64位版本的DLL,是否可以轻松地让应用程序选择哪一个进行P / Invoke?
我正在考虑在C#中创建两个辅助类:一个从32位DLL导入函数,另一个从64位DLL导入,然后为每个调用32位的导入函数创建一个包含一个函数的包装类导入程序或64位导入程序,具体取决于操作系统的“bittyness”。那会有用吗?
或者还有另一种简单的方法吗?
答案 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位实现。