【.NET】【VB6】Interop, AxInteropとは

タグの編集
投稿者 yukihiro  (社会人) 投稿日時 2016/1/26 02:33:13
お世話になっております。

VB6.0のプログラムを.NET Frameworkで動作させるよう検討しています。
手探りで調査しているのですが、どうにもよく分からず判断ができないものがあり、書き込みをさせていただきます。

ActiveX コントロールへの参照(例えば「Comctl32.ocx」)を含んだプロジェクトをVisualStudio2008に読み込ませると、
「Interop.Comctl32.dll」「AxInterop.Comctl32.dll」という2つの参照(とDLL)が出来上がります。

この二つはComctl32.dllへの参照はどちらもラッパーだという認識ですが、
①なぜ2つあるのか(違いは何か)
②片方(Interopのみ、AxInteropのみ)のものと両方あるものの差は何か
③APから参照する順番は「.NET → AxInterop → Interop → comコンポーネント」といういう認識だが間違いないか
④Aximp.exe (Windows フォーム ActiveX コントロール インポーター)というコマンドで作成されるものと同等品という認識で間違いないか

という点について、分かる方がいらっしゃいましたら教えて頂きたいです。

以上、お手数ですがよろしくお願いいたします。
投稿者 (削除されました)  () 投稿日時 2016/1/26 13:21:59
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/1/26 13:23:12
> (例えば「Comctl32.ocx」)
その ocx なら、すべてマネージクラスで置き換えられそうですが、
それは今回の本題ではない(あくまで例示されているだけ)でしょうから
横に置いておくとして…。


> ①なぜ2つあるのか(違いは何か)

Interop.*.dll は、COM の型情報やメタデータを含む相互運用機能アセンブリです。
VB6 で言うところの *.tlb や *.olb のようなものだと思って頂ければ良いでしょう。

【ランタイム呼び出し可能ラッパー】
https://msdn.microsoft.com/ja-jp/library/8bwh56xe.aspx


一方 AxInterop.*.dll は、Interop.~.dll で提供されるクラスを
.NET のコントロールとして使用するためのラッパークラスを提供しています。
(具体的には System.Windows.Forms.AxHost の継承クラス)


なお、自動生成されたものでない場合には、Interop.* と AxInterop.* 以外の
ファイル名が用いられるケースもありますし(ADODB.dll とか、CtlLayout.dll とか axLayout.dll など)、
Interop.* と AxInterop.* 両方の機能が、1 つのファイルで構成されるケースもあります。


ついでに書いておくと、.NET Framework 4 および Visual Studio 2010 以降では、
コンパイラに「相互運用型の埋め込み」を指示することが可能になっています。
この機能を使うと、実行可能ファイル内に RCW が内包され、
Interop な DLL を配布せずに呼び出せるようになります。


> ②片方(Interopのみ、AxInteropのみ)のものと両方あるものの差は何か

AxHost を必要としないライブラリ、具体的には、
ActiveX コントロールではなく ActiveX DLL だった場合には、
AxHost の派生クラス(すなわち、Ax 何某系のアセンブリ)が生成されません。

また、相手が ActiveX コントロールだったとしても、コンポーネントを
ツールボックスに登録するのではなく、単に参照設定しただけの場合には、
AxInterop が生成されません。

このあたりは VB6 も同様ですね。VB6 においても、
Comctl32.ocx を「コンポーネントの追加」した場合は、
COMCTL32.oca のキャッシュが生成されるとともに、コントロール配列用に
非表示属性なラッパーオブジェクト群が自動生成されますが、
Comctl32.ocx を「参照設定」した場合は、そうしたオブジェクトが作られません。

それと、アセンブリが自動生成される代わりに、
GAC (グローバル アセンブリ キャッシュ) にインストール済みの
PIA (プライマリ相互運用機能アセンブリ) が用いられるケースもあります。


> ③APから参照する順番は「.NET → AxInterop → Interop → comコンポーネント」といういう認識だが間違いないか
そんな感じです。別の書き方をすれば、
 「.NET クライアント → (AxHost 継承クラス →) RCW → COMコンポーネント」
といった所でしょうか。


> ④Aximp.exe (Windows フォーム ActiveX コントロール インポーター)というコマンドで作成されるものと同等品という認識で間違いないか
機能的には同一です。
Visual Studio の場合は、常に自動生成されるとは限らず、
GAC にある PIA が採用するケースがありますけれども。

ちなみに、相手が ActiveX コントロール以外の COM コンポーネントの場合には、
TlbImp.exe (タイプライブラリ インポーター)が該当します。
投稿者 yukihiro  (社会人) 投稿日時 2016/1/29 01:40:31
魔界の仮面弁士 さま

ご教授ありがとうございます。
ご返答が遅くなりまして申し訳ありません。

内容について、大変参考になりました。
特に②については、他者に聞かれても「できるものは出来る」としか
説明できない状況だったので……

まだ現在進行形で調査中であり、
また書き込みをさせて頂くかもしれませんが、
そのときはどうぞよろしくお願いいたします。

以上、ありがとうございました。

※以下の疑問について
>その ocx なら、すべてマネージクラスで置き換えられそうですが、
>それは今回の本題ではない(あくまで例示されているだけ)でしょうから
>横に置いておくとして…。

元々の指示として、「出来るだけ手を入れないで(最小限の修正で)」という事なので、
COMコンポーネントをラッパー越しに参照して使用する方針になっています……