9

私は、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でそれを行う方法を知っています。

テキストの壁で申し訳ありませんが、関連性があると感じた情報を維持できるように、状況をできるだけ説明したかったのです。

4

1 に答える 1

2

Visual Studio IDE は、COM Interop 用の DLL を登録するときと、コマンド プロンプトからコマンド ライン ツールを実行するときとでは、明らかに異なるパスを使用します。

マイクロソフトがこれをどこかに文書化したとは思えません。しかし、私の長年の経験は、これが事実であることを証明しています. .NET 2.0 Framework の「regsvcs」コマンドが実際に無限ループを引き起こす状況に遭遇したことがあります。Google で検索すると、おそらくこの問題を抱えている他のユーザーを見つけることができます。VS IDE を使用して .NET サービス コンポーネントの COM 登録を実行することで、さらに一歩進めることができました。しかし、それは必然的にエラーで終了しました。エラーは、無限ループの一歩前進でした。いずれにせよ、COM 相互運用機能とレジストリ エントリを処理する際に、VS IDE が異なるコード パス/ビジネス ロジックを使用することが証明されました。

于 2013-04-07T04:41:57.103 に答える