我正在使用C#(.NET 3.5,VS2005 Professional)应用程序,它使用用C / C ++编写的非托管32位库。我使用的API是这样的:
void * Initialize(int x);
voic GetData(void *);
当我在Windows XP 32bit上运行它时,这是有效的,但在Windows XP64bit上它会引发异常:
未处理的异常:System.Reflection.TargetInvocationException:调用的目标抛出了异常。 ---> System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B) at Aktuelizator.CommonLibrary.InitializeRingBuffer(Int32 dim) at Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()
当使用C / C ++中的32位非管理应用程序编写调用时,这些非托管DLL在64位XP下运行。
有没有人有任何想法?
答案 0 :(得分:2)
您的构建配置平台设置为“任何CPU”,这意味着在64位操作系统上它以64位运行,您无法加载该DLL。将其设置为x86,这将强制它以32位运行,无论操作系统如何,您的dll将加载正常。
答案 1 :(得分:1)
听起来您的DLL只编译为32位,但您尝试从32位和64位进程调用它。当然,前者会起作用。然而,后者不会。 32位DLL只能用于32位进程。尝试将DLL编译为64位目标,让C#应用程序使用该目标。
答案 2 :(得分:0)
检查所有定义为Int32的参数,实际上应该是IntPtr。