【发布时间】:2011-04-06 17:54:31
【问题描述】:
我有一个可以为 x86 和 x64 目标构建的非托管 VC++ 项目。它被为任何 CPU 编译的 .NET 程序使用。这是在 VS2010 上,但是当使用 VS2008 和 vcbuild 构建解决方案时,我遇到了同样的问题。
这是我的构建脚本中的构建命令:
msbuild .\Project.vcxproj /t:Build /p:PlatformToolset=v100 /p:Configuration=Release /p:Platform=%platform%
如果在 x86 机器上构建,%platform%=Win32,一切构建和执行都很好
如果在 x64 机器上构建,使用 %platform%=x64,一切都能正常构建和执行。
但是,如果我在 x64 机器上使用 %platform%=Win32 构建,它会成功构建且没有错误。但是当我将那些所谓的 x86 二进制文件复制到 x86 机器时,它们会导致以下错误:
System.Runtime.InteropServices.SEHException was caught
Message=External component has thrown an exception.
将该错误追溯到 C++ dll,它在这一行失败:
if ( FAILED( g_Connection.CreateInstance( _T("ADODB.Connection") ) ) )
ThrowException(_T("Cannot create connection."));
我浏览了我的 .vcxproj 文件以查找问题,但一切似乎都正确。没有导入的属性文件或自定义构建任务或类似的东西。
这会导致问题,因为我们正在尝试使用单个 x64 构建服务器来为两个平台创建构建。我们当前的解决方法包括在两台不同的机器上预先构建 C++ dll。
【问题讨论】:
-
能否发布在 x86 机器上运行时遇到的运行时错误?
-
“它们无法加载”,显然。
-
仔细查看后,它抛出了 SEHException,因此看起来 C++ dll 正在正确加载,但在创建对象时抛出了异常。我认为这是一个依赖问题,而不是 C++ dll 本身的问题。
标签: .net visual-studio-2010 visual-c++ msbuild