C#:根据平台访问 32 位/64 位 DLL
我们使用 C# 应用程序中自行编写的 32 位 C++ DLL。现在我们注意到,当 C# 应用程序在 64 位系统上运行时,会自动使用 64 位运行时,当然无法从 64 位运行时访问 32 位 DLL。
我的问题是:有没有办法使用32位DLL?如果不是,如果我创建了 DLL 的 64 位版本,是否可以轻松地让应用程序选择要 P/Invoke 的哪一个?
我正在考虑在 C# 中创建两个帮助器类:一个从 32 位 DLL 导入函数,另一个从 64 位 DLL 导入,然后为每个调用 32 位导入器或64 位导入程序取决于操作系统的“位数”。那行得通吗?
或者还有其他简单的方法来做事吗?
we use a self-written 32bit C++ DLL from our C# applications. Now we've noticed that when the C# applications are run on a 64bit system, the 64bit runtime is automatically used and of course the 32bit DLL can not be accessed from the 64bit runtime.
My question is: is there a way of using the 32bit DLL? If not, if I created a 64bit version of the DLL, would it be easily possible to let the application choose which one to P/Invoke to?
I'm thinking of creating two helper classes in C#: One that imports the functions from the 32bit DLL and one that imports from the 64bit DLL, then creating a wrapper class with one function for each imported function that calls either the 32bit importer or the 64bit importer depending on the "bittyness" of the OS. Would that work?
Or is there another easy way to do things?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要确保在 64 位编译时仅对 64 位 DLL 使用 P/Invoke 调用。
一种选择是将所有“方法”移至标准接口(或抽象基类)中,并提供 2 种实现,一种 32 位,一种 64 位。您可以使用工厂方法根据 IntPtr 的大小构造适当的类实例。
这允许“AnyCPU”应用程序在运行时正确确定要 P/调用哪个 DLL,并且可以正常工作。
You need to make sure that you're only using P/Invoke calls against a 64bit DLL when compiling in 64bit.
One option is to move all of your "methods" into a standard interface (or abstract base class), and provide 2 implementations, one 32bit and one 64bit. You can have a factory method construct the appropriate instance of the class depending on the size of IntPtr.
This allows an "AnyCPU" app to correctly, at runtime, determine which DLL to P/Invoke into, and does work.
创建一个包装 64 位和 32 位 DLL 的帮助程序类,并使用 IntPtr.Size 来确定要调用哪个。
Create a helper class that wraps both 64bit and 32bit DLLS, and use IntPtr.Size to determine which to call.
您可以将 .Net 应用程序标记为仅针对 x86 架构
You can flag the .Net app to only target x86 architecture
我有类似的问题,但问题是 Unrar.dll 是 32 位或 64 位。
有两种方法可以使其工作:
a)
编译 32 位和 64 位应用程序。
b)
另一种方法是为导入创建一个接口并分别实现 32 位和 64 位版本。
如果是 32 位,则实例化 32 位实现,否则实例化 64 位实现。
I had similar problem but it was with Unrar.dll being either 32 or 64bit.
There can be two approaches to make it work:
a)
And compile application for 32Bit and 64bit.
b)
Another way was to create an interface for the imports and implement 32 bit and 64 bits versions separately.
If 32 bit, instantiate the 32 bit implementation, else instantiate the 64 bit implementation.