gpt4 book ai didi

.net - 是否可以从为 'Any CPU' 编译为 64 位代码运行的 .NET 应用程序调用 64 位 native C++ DLL 文件?

转载 作者:太空狗 更新时间:2023-10-29 19:54:52 32 4
gpt4 key购买 nike

我正在 .NET 3.5 中编写一个程序,在某些地方必须从硬件 API 执行代码。这一切都很好,并且可以在 32 位 Windows 7、Windows XP 等系统中运行。问题来自 Windows 7 64 位。

我在“任何 CPU”中编译,它确实在 64 位 Windows 7 64 位上运行。因此,为了与这一硬件接口(interface),我必须在非托管 C++ 中编写自己的包装器 DLL。

因此,当我在 32 位中完成所有工作后,我将开关切换到 64 位,这就是问题所在。我遇到的问题与 Stack Overflow 问题完全相反 “An attempt was made to load a program with an incorrect format” even when the platforms are the same ...在那个问题中,他试图让他的代码在 Windows 7 上以 32 位(强制运行)运行。

好的,现在,我不想那样做,因为这个硬件的 64 位 API。所以,我在 64 位编译我的代码,然后经过大量的试验和错误,我在 64 位中正确地LINK,并且我有一个纯 64 位 native C++ DLL,并且 Depends.exe 确认了这一点。现在,Depends.exe 还将供应商的 DLL 文件显示为纯 64 位。这很好,因为第一次代码不起作用,我开始与制造商一起研究,他们在我的帮助下更新了他们的代码,或者我应该说我的问题......:)

所以,长话短说,我已将其分解为尽可能简单的设置。我的 DLL 文件,HW API.dll(也是 native C++)和调用它们的 .NET 应用程序,使用相同的 P/Invoke语法,并作为 64 位版本调用...

我的电话,仅供引用,如下所示:

[DllImport("xBiometrics.dll", ExactSpelling=true, SetLastError=true)]
[return: MarshalAs(UnmanagedType.I4)]
public static extern Int32 bioScanOpenDevice();

现在,当我尝试从 .NET 调用此代码时,出现异常错误:

"System.BadImageFormatException: 
An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)"

这让我相信某种 32 位的东西正在干扰......我怎么可能说出来?我的意思是,是的,我已经查看了资源浏览器,并确保 DLL 文件是从正确的位置加载的,而且它们是在 64 位中编译的,.NET 应用程序在 64 位中运行,即使它是为“任何 CPU”编译的。我已经验证了这一切......

我是不是对这里的某些事情完全愚蠢?我是否错过了告诉我们 P/Invoke 不能在 64 位或其他系统上工作的段落?如果我这样做了,为什么它会抛出一个错误的图像格式异常?

我正在做的事情是否可行? 64 位 .NET 应用程序可以加载和调用 64 位 native DLL 文件吗?那个 DLL 文件可以动态链接到另一个 native 64 位 DLL 文件吗?如果我使用托管的 64 位 DLL 文件作为楔形 DLL 文件,会有什么不同吗?由于硬件供应商的 DLL 文件中的一些调用,我只使用楔形 DLL 文件。他们将 void 指针传递给缓冲区,这样在 C# 中做起来太复杂了(必须检查“允许不安全代码”等)所以,我的楔形想法工作得更好......我做了所有的C++ 中的繁重工作,并将更多结构化数据传回 C# 代码。

最佳答案

我知道我可以从使用“任何 CPU”编译并在 64 位运行时下运行的 C# 程序调用 64 位 native DLL。

我会建议以下调试:

1) 在您的 C# 程序中,在程序启动时检查 IntPtr.Size 的值。如果它不是 == 8,那么您就没有在 64 位中运行。

2) 在 DllImport 中设置 64 位 DLL 的完整路径。即:

[DllImport(@"c:\fullpath\xBiometrics.dll", ExactSpelling=true, SetLastError=true)]

如果可行(我怀疑可行),那么问题是在您的 DLL 搜索路径中某处有一个 DLL 的 32 位拷贝。这让我不止一次被绊倒。

关于.net - 是否可以从为 'Any CPU' 编译为 64 位代码运行的 .NET 应用程序调用 64 位 native C++ DLL 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251018/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com