我有一個C++ 4.0應用程序引用C++應用程序中的類型庫。這用於一些安全的COM互操作,這是我原本問here的一個問題。當庫沒有註冊時,無法使用引用的TLB編譯.NET應用程序
在我的開發機器上安裝了第二個應用程序,這樣我就可以編譯而不出任何問題。如果我試圖編譯我們的自動化構建服務器,或與Visual Studio安裝,但沒有第二個程序在任何機器上,我收到以下錯誤,編譯失敗:
文本的谷歌:
類型或命名空間名稱找不到(是否缺少使用指令或程序集引用?)
無法獲得類型庫「guid ....」版本1.0的文件路徑。圖書館未註冊。 (異常來自HRESULT:0x8002801D(TYPE_E_LIBNOTREGISTERED))
引用的組件 'SecurityAgentLib' 找不到
圖片的可讀性:
我不知道如何解決這個問題比其他通過安裝註冊實現這些類型的實際dll的應用程序,但我不想在構建服務器上這樣做。使用這些類型的代碼被封裝在永遠不會實例化的類中,除非運行先決條件檢查來驗證應用程序是否已真正安裝,因此不會出現運行時錯誤。事實上,我可以在沒有安裝第二個應用程序的機器上運行我的應用程序 - 我只是無法在那裏編譯它。
在visual studio中,參考指向解決方案目錄中包含的.tlb文件,因此tlb文件本身存在。
我無法想象它應該以這種方式工作,並且我搜索了四周,但我顯然沒有在尋找合適的術語。
編輯: 運行tlbimp.exe會生成一個DLL,但類型庫應該足以進行編譯,至少我認爲。還有一個引用錯誤的問題。我正在閱讀這篇文章Troubleshooting Broken References,它說如果引用的是未安裝的COM組件,則安裝組件會糾正錯誤,這是正確的。
在生成服務器上安裝它確實不是一個選項。打開visual studio並重新添加引用如果路徑被破壞也不起作用。
我能夠使用tlbimp創建一個DLL並使用Visual Studio添加該DLL的引用。這讓我編譯,但如何在無人蔘與的生成服務器中工作?
編輯 好吧,我想出了這工作給我的這一切是無人
- 冉的要求TLBIMP創建從類型庫中一個dll兩種解決方案。我從我的項目中刪除了對tlb的引用,並添加了對dll本身的引用。當源代碼被複制到一臺新的計算機時,它編譯時沒有問題。
在這種情況下,理想情況下,我們將從構建服務器上的SVN簽出並複製第二個項目中的最新DLL,然後編譯此項目。
- 我也刪除了tlb並在visual studio中添加了dll,並在.csproj文件中做了一個diff。我沒有看到引用dll而不是tlb的任何缺點,但如果需要的話,構建服務器可以直接對此文件進行修改以刪除tlb部分,並在構建第二個引用後添加對dll的引用產品。
您必須運行Tlbimp.exe作爲獨立的構建步驟來生成互操作庫。最好做爲COM項目的後期構建步驟,以便確保在類型庫更改時重建C#項目。現在可以直接在C#項目中引用該互操作庫。 – 2011-12-15 09:12:50