2012-09-23 18 views
8

我正在將用VB6編寫的一個相當大的項目收斂到C#中。鑑於正在移交的項目規模龐大,正在18個月內分階段進行。我遇到了將VB6 ActiveX dll的引用添加到.Net項目的問題。在Visual Studio中添加VB6引用給出「類型庫導入器在類型驗證期間遇到錯誤」

如果您嚴格遵循這些步驟,您也應該能夠重新創建問題。

我已經寫在.net一個接口,COM可見:

<ComVisible(True)> 
Public Interface ITestInterface 
    Property A As String 
    Function TestMethod() As String 
End Interface 

通過選擇「註冊爲COM互操作」,在項目屬性編譯選項卡,你會得到一個TLB文件。

我已經創建了一個引用此TLB的VB6項目和一個實現了暴露界面的類。

Implements ITestInterface 

Private mA As String 

Public Property Get ITestInterface_A() As String 
    ITestInterface_A = mA 
End Property 

Public Property Let ITestInterface_A(ByVal value As String) 
    mA = value 
End Property 

Public Function ITestInterface_TestMethod() As String 
    ITestInterface_TestMethod = "From VB6" 
End Function 

如果我設置項目屬性的組件選項卡VB6中使用「遠程服務器文件」,然後在編譯時,TLB被自動創建。我可以在OLEVIEW查看TLB並請參閱下面的(除了在.NET項目中定義的接口的VB6做了具體實施的細節):

// typelib filename: TestVB6Interface.dll 

[ 
    uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**), 
    version(3.0) 
] 

// ... some other stuff 

// TLib :  // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755} 
importlib("SimpleDotNetLibrary.tlb"); 

現在,我創建了一個全新的。網絡項目。如果我增加了VB6的dll的參考,我得到以下錯誤:

無法解析COM引用 「ef005573-bfc7-436d-A382-f906ca09f94a」 3.0版本。類型庫導入程序在類型驗證期間遇到錯誤。嘗試導入沒有類成員。

但是,如果我啓動Visual Studio命令提示符並運行以下命令:

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll 

然後我可以添加DLL在我的.NET解決方案的參考和它的作品完美的罰款。

我的問題。當我直接添加引用時,tlbimp在命令行上做的事情還沒有完成。當Visual Studio中的消息說「嘗試導入沒有類成員」時,我如何在Visual Studio中執行此操作?我知道如何在tlbimp中做到這一點。

我對文本的牆壁表示歉意,但我想描述最好的情況,我可以保留我認爲相關的信息。

+0

你有沒有想過這個? – JMK

+0

我們做了(有點)。實現.Net接口的VB6類需要設置爲「屬性VB_Exposed = False」這意味着它不在TLB中或暴露在VB6 DLL之外,但仍然可以通過COM公開傳遞的方法,期望.NET接口(而這正是我們真正需要的)。這固定了症狀(錯誤消失!),但絕對沒有解決我的問題中解決的根本問題,因爲此解決方案可能不適用於所有人。 –

+0

夠公平的,出於純粹的好奇心,謝謝你的回覆!你確定, – JMK

回答

2

當爲COM Interop註冊DLL時,Visual Studio IDE明確採用不同的路徑,然後在從命令提示符運行命令行工具時執行此操作。

我懷疑微軟是否在任何地方記錄了這一點。但是,我多年的經驗證明了這一點。我曾遇到過一種情況:.NET 2.0框架中的「regsvcs」命令實際上會導致無限循環。如果你谷歌它可能會發現其他人有這個問題。通過使用VS IDE執行.NET服務組件的COM註冊,我能夠更進一步。然而,它不可避免地以錯誤結束。這個錯誤在無限循環中向前邁進了一步。無論哪種方式,向我證明,在處理COM Interop和註冊表項時,VS IDE採用不同的代碼路徑/業務邏輯。

+0

它的確如此。如果有任何警告,它不會導入TLB。 Tlbimp.exe在控制檯上顯示的警告類型,通常可能會被忽略,因爲它們是良性的。給或拿。 –

相關問題