投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 (タイプライブラリ インポーター)が該当します。