我正在將用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中做到這一點。
我對文本的牆壁表示歉意,但我想描述最好的情況,我可以保留我認爲相關的信息。
你有沒有想過這個? – JMK
我們做了(有點)。實現.Net接口的VB6類需要設置爲「屬性VB_Exposed = False」這意味着它不在TLB中或暴露在VB6 DLL之外,但仍然可以通過COM公開傳遞的方法,期望.NET接口(而這正是我們真正需要的)。這固定了症狀(錯誤消失!),但絕對沒有解決我的問題中解決的根本問題,因爲此解決方案可能不適用於所有人。 –
夠公平的,出於純粹的好奇心,謝謝你的回覆!你確定, – JMK