2010-03-31 52 views
0

最初的問題是我嘗試使用調試符號重建C++項目並將其複製到測試機器上,該項目的輸出是外部COM服務器(。 exe文件)。當使用託管擴展構建C++項目時,VC++編譯器/鏈接器會做什麼

當調用COM接口函數時,有一個RPC調用失敗: COMException(0x800706BE):遠程過程調用失敗。

根據COM HRESULT設計,如果FACILITY代碼是7,實際上是WIN32錯誤,並且win32錯誤代碼是0x6BE,這是上面提到的「遠程過程調用失敗」。

我所做的只是替換COM服務器.exe文件,原始文件運行良好。

當我簽入項目時,我發現它是一個帶有託管擴展的C++項目。 當我用反射器檢查DLL時,它顯示有2個額外的.NET程序集引用。

然後我檢查了項目設置,沒有發現任何關於額外的2裝配參考。 我打開了包含編譯器選項和鏈接器的詳細庫,並嘗試分析程序集是否通過.h文件間接引用。

我收集了所有的.h文件,並用'#using''#import'和程序集文件自己grep所有文件。

在.h文件中有一個'#using',但與引用程序集不相關。

關於鏈接的.lib庫文件,只有一個.lib文件是另一個託管擴展啓用的C++項目的副產品,其他所有其他文件都是由純粹的傳統C++項目生成的。對於啓用託管擴展的C++項目,我檢查了輸出DLL程序集,它沒有引用2程序集。

我甚至嘗試通過sysinternal的filemon和procmon捕獲附加程序集文件的訪問,但重建過程不能訪問這些文件。

我很困惑VC++/CLI項目的編譯和鏈接過程模型,其中附加程序集引用滑入最終程序集?

在此先感謝您的幫助。

回答

1

我已經解決了這個問題,我想與大家分享一些經驗:

  1. 的VC++編譯器可以把整個項目的啓用ManagedExtension,您可以通過 項目屬性 - 設置>一般 - >通用語言運行時支持。

  2. 你也可以把它打開了個人.cpp文件,但在.vcproj文件,對整個項目的屬性名稱是「ManagedExtension」而對於個人.cpp文件屬性爲「CompileAsManaged」

  3. VC++編譯在編譯時嵌入引用的程序集,而不是鏈接時間。因此,在.obj文件中嵌入對特定版本的程序集的引用。我使用Cygwin的字符串 實用程序提取參考裝配

  4. 的.lib文件的名稱只是.obj文件

  5. 從連接的角度出發存檔,有原生obj文件並沒有什麼區別。 lib文件。 MSIL代碼的元數據只是作爲數據存儲在一段(我猜)中。

順便說一句,我試過使用反射器+ reflexi來破解參考組件版本,但這個功能不能用於混合組件。

相關問題