2011-04-08 150 views
2

我正在使用Visual Studio 2008 Express。我有一个解决方案,用于在Vista 32位上正常工作。我最近切换到Windows 7,其中一部分停止工作。这是我的设置: - 非托管C++静态库,“库” - 包装用于C#的“库”功能的托管C++ DLL,“DLL” - 引用“DLL”的托管C++控制台应用程序引用“DLL”的C#应用​​程序在Windows 7上构建Visual Studio 2008 Express C++ 32位64位

运行C#应用程序时,我收到了DLL引发的异常,我通常会通过托管C++控制台应用程序调试类似这样的问题,因为我可以接着进入非托管库代码。

的问题是,我现在得到了一些奇怪的符号的弹出式对话框和路径“C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ dw20.exe”,然后我的应用程序捕获例外当我尝试运行托管C++控制台应用程序时,“System.BadImageFormatException:不是有效的Win32应用程序”。我花了很多时间研究这个问题,任何甚至类似于有用建议的东西都指的是在C#中构建X86项目,但与C++无关。我尝试将/MACHINE:X86添加到库的Librarian选项中,但似乎不起作用。

我想简而言之,我的问题是,我如何才能确保我的非托管C++静态库的构建,以便它可以在32位系统上运行?

回答

0

更改从任何CPU构建到32或86,你应该没有问题。你可能在C++代码中使用了一个windows 32 dll,这就是为什么它不能在其他平台上工作。 任何CPU->配置管理器,然后更改为32或86

+0

在C++中没有类似的选项,只能在C#中使用。唯一可用的构建是Win32。 – Hazerider 2011-04-08 13:27:11

4

dw20.exe程序是“Doctor Watson”,该程序报告未处理的运行时异常和崩溃。不是问题的根源,仅仅是信使。虽然在这个问题中没有提到,但我必须假设你的Windows 7版本是64位的,这是System.BadImageFormatException的常见来源。

异常是由64位进程尝试加载为32位构建的DLL而引起的。或者相反,32位进程无法加载64位DLL。这个过程的尴尬程度取决于您的案例中的EXE,一个C++/CLI应用程序。它没有选择使用简单的项目设置来更改它,就像C#项目一样。您可以通过添加平台来实现,“x64”使用64位编译器并生成64位可执行文件。我敢肯定,在C++ Express版中没有提供,但没有64位编译器,因此必须始终生成32位可执行文件。

这对于解释异常没有多大余地。如果您更改了C#类库项目中的平台目标设置,它只会出错。从x86或AnyCPU到x64。将其更改回AnyCPU。项目+属性,生成选项卡。如果您已经做了任何事情来解决Express版本的限制,比如从SDK版本中添加64位编译器,那么这也将成为问题源头的主要红旗。

+0

确实,我在Windows 7 64位。我没有意识到有一个32位版本。所以奇怪的是,我的C#应用​​程序正在工作,它是给我这个C++/CLI控制台应用程序。它被设置为以MachineX86为目标。我想我应该提及它正在工作一段时间,然后在我不得不卸载Windows 7 Service Pack 1(与ADO类型库混淆)时下地狱。 – Hazerider 2011-04-08 14:25:19

+0

那么,你有一个因果关系。如何影响你的代码是完全无法从你的问题中推测出来的。 – 2011-04-08 14:30:53

相关问题