2013-03-27 67 views
4

假設我們在VS 2005中有一個.NET項目(VB .Net)。 該項目使用非GUI COM對象。當我添加對這個對象的引用時,VS創建互操作dll。但是我在另一個項目中向COM對象添加了新的方法。如何在沒有明確調用tlbimp的情況下更新interop dll?我希望Intellisense在此COM對象中顯示新方法的列表。interop dll如何輕鬆更新?

+0

創建一個構建步驟來重新生成它,具體取決於COM DLL?它可以在COM DLL上選擇更改的時間戳以觸發重建。 – Rup 2013-03-27 11:53:57

+0

嗯,我的意思是Intellisense的prebuild更新:是否VS捕獲外部重新引用的COM對象? – ilya 2013-03-27 12:20:56

回答

1

如果我正確地理解了你,你有一個COM服務器(顯然是進程內/ DLL),它託管你正在更新的對象。當你還沒有編譯COM服務器時,你希望通過客戶端項目中的IntelliSense提供這些更新,對嗎?

如果是這樣:這是不可能的。讓我來描述爲什麼:

智能感知只爲項目的引用構建一個文檔緩存。引用COM服務器與引用.NET項目不同。對於.NET項目,它可以直接從代碼模型構建文檔緩存。不過COM服務器通常用一種語言來描述,編譯器不知道! tlbimp會生成一個爲您調用COM服務器的.NET包裝器。智能感知能夠理解包裝(互操作DLL,它不過是一個自動生成的.NET DLL),但不是它實際做的。所以你總是需要保持包裝最新。

無論您何時更改COM服務器,您都需要註冊(使用regsvr32),以便更改對客戶端(在本例中爲tlbimp)「可見」。然後,您必須重新添加對.NET項目的引用,這會導致tlbimp生成一個IntelliSense可以理解的新Interop DLL。這就是處理在.NET環境COM ...

但是你可以嘗試一點點進一步自動化構建過程:

  1. 在您的服務器項目,在生成後事件調用tlbimp,並讓它創建Primary Interop Assembly
  2. 將PIA自動部署到GAC
  3. 在您的客戶項目(.NET項目)中,引用PIA。
  4. 每當你已經建立一個新的服務器項目,刷新了智能感知緩存在您的客戶端項目(「編輯」 - >「智能感知」 - >「刷新本地緩存」,或按Ctrl ++[R)。

希望這會有所幫助!

+1

謝謝,我明白.Net包裝需要重建,我必須重新添加引用。 – ilya 2013-04-03 07:22:50