2012-05-23 31 views
0

我有一個傳統的VB6 COM DLL作爲.NET項目中的參考。我的手工打造過程是這樣的:如何自動更新.NET項目COM引用?

  1. 構建VB6 DLL
  2. 複製VB6 DLL參考目錄
  3. 註冊VB6 DLL與regsvr32
  4. 在.NET項目,刪除舊參考
  5. 添加對新VB6 DLL的引用(瀏覽)
  6. 將引用的Isolated屬性設置爲True
  7. 構建.NET解決方案

我正在自動執行此過程。步驟4到6給我帶來麻煩。當我註冊新的VB6 COM DLL時,.NET項目中的舊引用無效。通過查看項目文件,我看到:

<ItemGroup> 
    <COMReference Include="DllName"> 
    <Guid>{65CDCC83-E707-4AA3-8940-FE79F265D570}</Guid> 
    <VersionMajor>50</VersionMajor> 
    <VersionMinor>0</VersionMinor> 
    <Lcid>0</Lcid> 
    <WrapperTool>tlbimp</WrapperTool> 
    <Isolated>True</Isolated> 
    <EmbedInteropTypes>True</EmbedInteropTypes> 
    </COMReference> 
</ItemGroup> 

我相信我需要與COM的新的CLSID自動覆蓋Guid財產,我可能需要改變VersionMajorVersionMinor性能。

不幸的是,這些似乎不是VB6 COM DLL文件的屬性。我在哪裏可以獲得這些信息,或者我是否可以走上正確的道路?有一些工具或選項會自動爲我做這個嗎?

編輯

生成錯誤,如果我不更新參考我得到的是錯誤MSB3179

錯誤消息的實際文本是:

C:\的Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets(2580,9):錯誤MSB3179:問題隔離COM參考'DllName':未檢測到此組件的註冊類。 [path/to/projfile.vbproj]

...其中「DllName」是我的DLL名稱,「path/to/projfile.vbproj」是具有COM引用的項目文件的完全限定路徑。

+0

我不認爲你可以解決這個問題,而不使用VB6二進制兼容性選項,所以GUID保持穩定。 –

+0

@HansPassant - 是的,我現在將DLL設置爲二進制兼容性,我看到Guid和版本保持不變。但是,當我構建解決方案時,我仍然遇到MSB3179錯誤。 –

+0

錯誤信息的實際文字是什麼? –

回答

0

我還沒有試過這個,但是你可以通過顯式地使用tlbimp生成一個互操作程序集而不是讓Visual Studio通過添加對COM DLL的引用來實現。

是這樣的:

  1. 生成VB6 DLL
  2. 複印VB6 DLL引用目錄
  3. 運行TLBIMP(例如,從一個批處理文件),以產生在參考目錄互操作程序集。
  4. .NET項目應該在步驟3中引用互操作程序集輸出。
  5. 生成。NET解決方案

用你的方法,我不再使用免註冊COM

我沒有與REG-COM無多少經驗,但也許你可以手動生成使用命令行工具而不是設置Isolated屬性 - 例如使用this answer中描述的MT.EXE工具。

+0

我一直在嘗試。它在開發機器上工作,但不是在發佈後(我使用ClickOnce)。使用你的方法,我不再在我的部署中使用免註冊COM(這是Isolated屬性的作用)。如果我在沒有註冊COM dll的情況下自己生成interop,則Isolated屬性不可用。 –

+0

@Scott,查看更新。 – Joe

+0

我認爲這是答案,但我似乎無法得到它的工作。部分原因是缺乏對無寄存器COM的理解。我是通過讓Visual Studio爲我完成所有工作而作弊的。 :) –

相關問題