C#:根据平台访问32位/64位DLL 我们使用了自编写的32位C++ + DLL。现在我们注意到,当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然,32位DLL不能从64位运行时访问

C#:根据平台访问32位/64位DLL 我们使用了自编写的32位C++ + DLL。现在我们注意到,当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然,32位DLL不能从64位运行时访问,c#,64-bit,pinvoke,dllimport,C#,64 Bit,Pinvoke,Dllimport,我的问题是:有没有一种使用32位DLL的方法?如果不是,如果我创建了一个64位版本的DLL,那么让应用程序选择P/调用哪个DLL是否容易 我正在考虑在C#中创建两个帮助器类:一个从32位DLL导入函数,另一个从64位DLL导入函数,然后为每个导入函数创建一个包装器类,根据操作系统的“位性”调用32位导入器或64位导入器。这样行吗 或者还有其他简单的方法吗?您可以将.Net应用程序标记为仅针对x86体系结构我也有类似的问题,但unrr.dll是32位还是64位 有两种方法可以使其工作: (a) 并

我的问题是:有没有一种使用32位DLL的方法?如果不是,如果我创建了一个64位版本的DLL,那么让应用程序选择P/调用哪个DLL是否容易

我正在考虑在C#中创建两个帮助器类:一个从32位DLL导入函数,另一个从64位DLL导入函数,然后为每个导入函数创建一个包装器类,根据操作系统的“位性”调用32位导入器或64位导入器。这样行吗


或者还有其他简单的方法吗?

您可以将.Net应用程序标记为仅针对x86体系结构

我也有类似的问题,但unrr.dll是32位还是64位

有两种方法可以使其工作:

(a)

并编译32位和64位的应用程序

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


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

在64位编译时,需要确保仅对64位DLL使用p/Invoke调用

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


这允许“AnyCPU”应用程序在运行时正确地确定p/调用哪个DLL并正常工作。

创建一个包含64位和32位DLL的帮助器类,并使用IntPtr.Size确定调用哪个DLL

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

是的,我们已经试过了,但我当然希望应用程序在64位系统上以64位模式运行。如果您希望它以64位模式运行,然后你需要它导入的所有库也是64位的-然后你可以将它们包装在一个静态类中,并处理关于在运行时调用哪个库的逻辑基本上你是说我在我的问题中建议的方法是什么?嗯,你不能在一个进程中混合使用x86和x64,所以你要么只需要使用x86,或者你已经考虑过的魔法包装。好的,谢谢。我会考虑你的答案作为解决方案,因为评论给了我正确的想法。是的,我们可以做到这一点,但是当然,最好不要总是想着两个平台的编译……我已经把这个答案标记为可接受的解决方案,因为这是我问问题以来成功完成的。
if (IntPtr.Size == 8)
{
    Helper.SomeMethod64();
}
else
{
    Helper.SomeMethod32();
}