在x64上构建VC++项目,无法在x86上执行

问题描述:

我有一个可以为x86和x64目标构建的非托管VC++项目。它正在被任何CPU编译的.NET程序使用。这是在VS2010上,但当解决方案使用VS2008和vcbuild构建时,我遇到了同样的问题。在x64上构建VC++项目,无法在x86上执行

这里是我的构建脚本编译命令:

msbuild .\Project.vcxproj /t:Build /p:PlatformToolset=v100 /p:Configuration=Release /p:Platform=%platform% 

如果在x86机器上生成,用%平台(%)= Win32中,一切都建立并执行罚款

如果在x64机器上建立,使用%platform%= x64,所有内容都会生成并执行正常。但是,如果我使用%platform%= Win32在x64机器上构建,那么它将成功构建而不会出错。但是,当我那些所谓-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。

+0

您可以发布尝试在x86机器上运行时遇到的运行时错误吗? – Jacob 2011-04-06 17:56:34

+0

“显然不能装载”。 – 2011-04-06 18:13:52

+0

仔细一看,它抛出了一个SEHException,所以它看起来像C++的DLL正在被正确加载,但抛出一个异常,创建一个对象。我认为这是一个依赖性问题,而不是C++ dll本身的问题。 – 2011-04-06 18:19:01

我追踪的问题重新回到这条线巧妙地隐藏在头文件中的一个:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile") 

,将始终与msdado15.dll x64版本的链接DLL的x86,在x64机器上进行构建 - 无论构建目标平台。

我解决它通过两个平台的ADO文件复制到我的项目目录,并更新项目和标题:

#import "msado15.dll" no_namespace rename("EOF","EndOfFile") 

.vcxproj文件:(只显示培训相关线)

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> 
    <ClCompile> 
     <AdditionalIncludeDirectories>.\ado\Win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
    </ClCompile> 
</ItemDefinitionGroup> 
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> 
    <ClCompile> 
     <AdditionalIncludeDirectories>.\ado\x64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> 
    </ClCompile> 
</ItemDefinitionGroup>