C#:根据平台访问32位/ 64位DLL
我们使用来自C#应用程序的自编写32位C ++ DLL。 现在我们注意到当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然也无法从64位运行时访问32位DLL。
我的问题是:有没有办法使用32位DLL? 如果没有,如果我创建了64位版本的DLL,是否可以轻松地让应用程序选择哪一个进行P / Invoke?
我想在C#中创建两个辅助类:一个从32位DLL导入函数,一个从64位DLL导入,然后创建一个包装类,每个导入的函数都有一个函数调用32位导入器或者64位导入程序取决于操作系统的“bittyness”。 那会有用吗?
或者还有另一种简单的方法吗?
在64位编译时,您需要确保只对64位DLL使用P / Invoke调用。
一种选择是将所有“方法”移动到标准接口(或抽象基类)中,并提供2个实现,一个32位和一个64位。 您可以使用工厂方法根据IntPtr的大小构造类的相应实例。
这允许“AnyCPU”应用程序在运行时正确地确定要调用哪个DLL,并且确实有效。
创建一个包装64位和32位DLLS的帮助程序类,并使用IntPtr.Size来确定要调用的内容。
if (IntPtr.Size == 8) { Helper.SomeMethod64(); } else { Helper.SomeMethod32(); }
您可以将.Net应用程序标记为仅针对x86体系结构
我有类似的问题,但是Unrar.dll是32或64位。
可以有两种方法使其工作:
一个)
#if x64 // ... define all x64 imports here #else // ... define all x86 imports here #endif
并编译32Bit和64bit的应用程序。
b)另一种方法是为导入创建接口,并分别实现32位和64位版本。
如果是32位,则实例化32位实现,否则实例化64位实现。