非托管 dll 代码
我有一个 C#(.NET 3.5、VS2005 Professional)应用程序,它使用用 C/C++ 编写的非托管 32 位库。 我使用的API是这样的:
void * Initialize(int x);
语音 GetData(void *);
当我在 Windows XP 32 位上运行它时,这是有效的,但在 Windows XP64 位上它会抛出异常:
未处理的异常:System.Reflection.TargetInvocableException:调用的目标已引发异常。 ---> System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT 异常:0x8007000B) 在 Aktuelizator.CommonLibrary.InitializeRingBuffer(Int32 暗淡) 在 Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()
当从 32 位非管理应用程序 writetn 在 C/C++ 中调用时,这些非托管 DLL 在 64 位 XP 下工作。
有人有什么主意吗?
I am having a C# (.NET 3.5, VS2005 Professional) application that uses unmanaged 32bit library written in C/C++. API that I use is like this:
void * Initialize(int x);
voic GetData(void *);
And this works when I run it on Windows XP 32bit, but on Windows XP64bit it throws exception:
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
at Aktuelizator.CommonLibrary.InitializeRingBuffer(Int32 dim)
at Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()
These unmanaged DLL's work under 64bit XP when called from 32bit unmanages application writetn in C/C++.
Does anyone have any idea?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您的构建配置平台设置为“任何 CPU”,这意味着在 64 位操作系统上它以 64 位运行,并且您无法加载 dll。 将其设置为 x86,这将强制它以 32 位运行,无论操作系统如何,并且您的 dll 将正常加载。
Your build configuration Platform is set to 'Any CPU', that means on a 64 bit OS it runs as 64 bit and you can't load the dll. Set it instead to x86, this will force it to run as 32 bit regardless of OS and your dll will load fine.
听起来您的 DLL 仅编译为 32 位,但您尝试从 32 位和 64 位进程调用它。 当然,前者会起作用。 然而,后者不会。 32 位 DLL 只能在 32 位进程中使用。 尝试将 DLL 编译为 64 位目标并让 C# 应用程序使用该目标。
It sounds like your DLL is only compiled to 32 bit, but you try to call it from both a 32 bit and 64 bit process. The former will work, of course. The later, however, won't. 32 bit DLLs can only be used in 32 bit processes. Try compiling the DLL to a 64 bit target and let the C# app use that one.
检查所有定义为 Int32 的参数,实际上应该是 IntPtr。
Check all parameters that are defined as Int32, that should in fact be IntPtr.