8

ある顧客は、VB6から.NETDLLを使用したいと考えています。これらは逆相互運用をサポートするように設計されており、すべて正常に動作します...ただし、次の点を除きます。2つの異なるディレクトリに2つの別個のVB6プログラムがあります。次のいずれかを実行する必要があるようです。

  1. .NET DLLを両方のディレクトリにコピーするか、または
  2. .NETDLLをGACにインストールします

これはお客様の見解であり、RegAsmのドキュメントでもサポートされています。

Regasm.exeを使用してアセンブリを登録した後、それをグローバルアセンブリキャッシュにインストールして、任意のCOMクライアントからアクティブ化できるようにすることができます。アセンブリが単一のアプリケーションによってのみアクティブ化される場合は、そのアプリケーションのディレクトリに配置できます。

私はこの点で混乱しています。

混乱の最初のポイント:

私が理解している限り、COMランタイムはProg ID /ClassIDを使用してDLLを検索します。レジストリでクラスIDエントリを確認すると、CodeBaseキーに.NETDLLへのフルパスが表示されます。Prog ID / Class IDを使用するCOMプログラムが、CodeBaseを使用して.NET DLLを見つけられないのはなぜですか?

混乱の2番目のポイント:

GACは.NETに固有です。COM参照の解決にどのように関与していますか?

4

1 に答える 1

7

COMはProgIdを使用してClassIdにアクセスし、COMサーバーにアクセスしてロードします。.NET COM dll の場合、COM サーバーは実際には .NET dll ({CLSID}/localserver32 の下のデフォルト キーの値) ではなく、MSCOREE です。COM ではなく MSCOREE は、.NET アセンブリを見つけるために必要なルールを使用できます。

現時点では、.NET が実際に何をするのかわかりません。それにはテストが必要です。FUSLOGVWを使用して自分自身を監視できます。ただし、他の.NETアセンブリをロードするのと同じようにアセンブリをロードすると推測できます。

ClassName 値を使用して Assembly.Load() を呼び出すだけであると仮定すると、.NET バインディング ルールに従います。最初に GAC を調べます。見つからない場合はプローブします。したがって、コードベースが定義されている場合はそこだけを調べます。それ以外の場合は、アプリケーション ベースに基づいてプローブします (デフォルトではアプリのディレクトリ [ただし、ASP.NET の場合は除きます)。 ]))。

それはあなたがレガズムで読んだものと一致すると思います。

あなたの質問はとても古いので、 OBEだったと思いますが、アセンブリを app directoryに配置する、 codebase を使用する、またはGACにアセンブリを配置するために使用するルールは、com 相互運用の有無にかかわらず同じです。すべての状況は異なり、深い洞察を放棄するのに十分な .NET を行っていません。私は xcopy インストールを好むので、アプリ ディレクトリに移動します (そして、登録不要の COMを使用します) が、2 つの vb アプリが同じバージョンの COM オブジェクトを使用する必要があるかどうかなど、他の考慮事項があります。

于 2010-10-15T18:13:44.797 に答える