【问题标题】:Visual Studio 2008 Express C++ 32 bit build on Windows 7 64 bitVisual Studio 2008 Express C++ 32 位构建于 Windows 7 64 位
【发布时间】:2011-08-01 12:32:58
【问题描述】:

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

运行 C# 应用程序时,DLL 抛出异常,我通常通过托管 C++ 控制台应用程序调试此类问题,因为我可以进入非托管库代码。

问题是我现在得到一个弹出对话框,其中包含一些奇怪的符号和 "C:\Windows\Microsoft.NET\Framework\v2.0.50727\dw20.exe" 的路径,并且然后当我尝试运行托管 C++ 控制台应用程序时,我的应用程序捕获了一个异常 "System.BadImageFormatException: is not a valid Win32 application"。我花了很多时间研究这个问题,任何与有用的建议很相似的东西都是指用 C# 构建 X86 项目,但与 C++ 无关。我尝试将 /MACHINE:X86 添加到库的 Librarian 选项中,但这似乎不起作用。

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

【问题讨论】:

    标签: c++ visual-studio-2008 windows-7 32bit-64bit


    【解决方案1】:

    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 位编译器,那么这也是问题根源的一个主要危险信号。

    【讨论】:

    • 确实,我使用的是 Windows 7 64 位。我没有意识到有 32 位版本。所以奇怪的是,我的 C# 应用程序正在运行,它是 C++/CLI 控制台应用程序给了我这个。它设置为以 MachineX86 为目标。我想我应该提到它工作了一段时间,然后当我不得不卸载 Windows 7 Service Pack 1(它与 ADO 类型库混淆)时就下地狱了。
    • 嗯,你有一个因果关系。从您的问题中完全无法猜测这会如何影响您的代码。
    【解决方案2】:

    将内置的任何 CPU 更改为 32 或 86,应该没有问题。您可能在 c++ 代码中使用了 windows 32 dll,这就是它在其他平台上不起作用的原因。 任何 CPU-> 配置管理器然后更改为 32 或 86

    【讨论】:

    • 在 C++ 中没有类似的选项,只有在 C# 中。唯一可用的版本是 Win32。
    猜你喜欢
    • 2010-12-26
    • 2011-10-05
    • 2012-11-08
    • 1970-01-01
    • 2010-12-24
    • 2010-12-15
    • 2011-12-21
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多