2009-11-03 103 views
46

私は何らかの説明が必要です。 Crystal Reportsを使用するReportwriter DLLがあります。これはVB6で書かれています。私はこのDLLをasp.netプロジェクトに追加しなければなりません。そこでは、interopのDLLが作成されます。interop dllとは何ですか?

私の理解によれば、interop dllは仲介者として存在し、私の.netコードはReportwriter dllと話すことができます。

私はinterop dllを登録するのですか、元のdllを登録しますか?

+0

+1他に誰もあなたに投票しなくても良い質問だったと思います。 :) – Dusty

答えて

85

VB6でコードを記述すると、コンパイル結果はCOMコンポーネントになります。 COMコンポーネントは、通常、COMタイプライブラリを使用して記述されるインタフェース、コクラス、構造体、列挙型を提供します。ただし、.NETのCOMコンポーネントを使用するには、.NETが理解できる形式(つまり、型ライブラリを直接使用できないため.NETアセンブリ)で型記述が必要です。したがってinteropアセンブリは、タイプライブラリ内の同じものに対応するインタフェース、構造体などの記述を含むという意味で、単に "変換された" COM型ライブラリです。

(相互運用機能アセンブリがタイプライブラリから製造されるを持っていないとして上記の、やや単純化している - 。あなたは手でコードすることができますいずれかをしたい場合は、例えば)

であることに反して

interopアセンブリには実行可能なコードが含まれていないことが多く、マーシャリングは行われません。それは型定義のみを含み、メソッドを持つことができる唯一の場所はインターフェースにあり、インターフェースのメソッドには実装がありません。 .NET呼び出しをCOMに呼び出すことは、実際には相互運用アセンブリから読み込まれた型記述に基づいてCLR自体によって実行されます。必要なコードはすべてオンザフライで生成されます。

あなたの質問にお答えします。 COM DLL(VB6の出力)プロジェクトを登録する必要があります。たとえば、regsvr32.exeを使用します。 COMコンポーネントではないので、interopアセンブリを登録することはできません(実際にはできません)。これはプレーンな.NETアセンブリなので、.exe/.dllを使用して同じフォルダに配置するかいつものようにGACに入れてください。

+0

どうすれば、interopは、.NETコードからそのメソッドへの呼び出しを行ったときに、レポートdllの存在を知ることができますか? interopはレジストリ内のキーを翻訳しますか? –

+1

COMコンポーネントを登録すると、その場所がレジストリに記録され、コンポーネントのGUIDがわかっている場合はそこから取得できます。 Interopアセンブリは、生成された型ライブラリのGUIDと、その型ライブラリ内のすべての型のGUIDを認識します。これらは.NET属性として格納されます。ランタイムはこの情報を使用して、レジストリを介してCOMコンポーネントを解決します。 –

2

あなたは正しいですか? interop DLLは呼び出しをVB6コンポーネントにラップし、それらを透明にします。

アプリケーションを実行しているマシンにDLLを登録するときは、まだVB6 DLLを登録する必要があります。 interop DLLは、あなたのアプリのbinフォルダにあり、呼び出しをマーシャリングします。

2

VB6 DLLを登録して.NETプロジェクトで参照する必要があります。その参照によって作成されるInterop.dll

関連する問題