2012-09-23 27 views
8

VB6で書かれたむしろ大きなプロジェクトをC#に変換しようとしています。移転されるプロジェクトの規模を考えると、18ヶ月間にわたって段階的に実施されています。私は.NetプロジェクトにVB6 ActiveX dllのリファレンスを追加することに問題があります。Visual StudioでVB6リファレンスを追加すると、タイプライブラリのインポーターでタイプ検証中にエラーが発生しました。

これらの手順を正確に実行すると、問題を再現できるはずです。私はCOM表示されている.NETのインターフェース書かれている

:プロジェクトのプロパティの[コンパイル]タブで、「COM相互運用のための登録」を選択することで

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

を、あなたは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 

私は、コンパイル時にTLBが自動的に作成され、その後、「リモートサーバーファイル」を使用してVB6でプロジェクトのプロパティの[コンポーネント]タブを設定した場合。私は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への参照を追加する場合、私は次のエラーを取得する:

は "ef005573-bfc7-436d-a382-f906ca09f94a" バージョン3.0をCOM参照を解決できませんでした。タイプライブラリインポータで型の検証中にエラーが発生しました。クラスメンバーなしでインポートしてみてください。私は、Visual Studioコマンドプロンプトを起動して実行する場合

ただし、以下:

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

は、その後、私は私の.NETソリューションの基準とそのDLLを追加することができますし、それは完全に正常に動作します。

私の質問です。 tlbimpはコマンドラインで何をしているのですが、参照を直接追加するだけでは完了しません。 Visual Studioのメッセージに「クラスメンバーを使用しないでインポートしようとしています」と表示されたら、Visual Studio内でどのように正確に行うのですか?私はtlbimpでそれを行う方法を知っています。

私はテキストの壁について謝罪しますが、私が感じた情報を保つことができる限り最良の状況を説明したいと思います。

+0

あなたはこれを理解しましたか? – JMK

+0

私たちはしました(ちょっと)。 .Netインターフェイスを実装するVB6クラスは "Attribute VB_Exposed = False"に設定する必要があります。これは、TLBにないかVB6 DLLの外部に公開されていることを意味しますが、.Netインターフェイス(とにかくそれは本当に必要なものです)。これは症状を修正しました(エラーは消えてしまいますが)、この解決策は誰にとってもうまくいかない可能性があるので、間違いなく私の疑問に対処した根本的な問題は解決していません。 –

+0

十分な公正、純粋な好奇心から尋ねる、返信のおかげで! – JMK

答えて

2

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

私はマイクロソフトがこれをどこでも文書化しているのではないかと疑います。しかし、私の長年の経験は、これが事実であることを証明しています。かつて、.NET 2.0 Frameworkの "regsvcs"コマンドが実際に無限ループを引き起こす状況に遭遇しました。あなたがGoogleの場合は、おそらく他の人がこの問題を抱えているのを見つけるだろう。 VS IDEを使用して.NET Serviced ComponentのCOM登録を実行することで、さらに進歩させることができました。しかし、それは必然的に間違いで終わった。このエラーは、無限ループの一歩前進でした。いずれにしても、COM Interopとレジストリエントリを扱うときにVS IDEが異なるコードパス/ビジネスロジックをとることがわかった。

+0

です。警告があればTLBをインポートしません。 Tlbimp.exeがコンソールに表示する警告の種類であり、良質なため無視されることがあります。ギブオアテイク。 –

関連する問題