私は、VB6 で書かれたかなり大きなプロジェクトを C# に変換しようとしています。移行するプロジェクトの規模を考慮して、移行は 18 か月にわたって段階的に行われます。VB6 ActiveX dll の参照を .Net プロジェクトに追加する際に問題が発生しています。
これらの手順を正確に実行すると、問題を再現できるはずです。
COM が表示される .Net でインターフェイスを作成しました。
<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");
ここで、まったく新しい .Net プロジェクトを作成します。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でそれを行う方法を知っています。
テキストの壁で申し訳ありませんが、関連性があると感じた情報を維持できるように、状況をできるだけ説明したかったのです。