2011-04-06 158 views
0

我有一個可以爲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

回答

0

我追蹤的問題重新回到這條線巧妙地隱藏在頭文件中的一個:

#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> 
相關問題