web-dev-qa-db-ja.com

RegAsm-/ codebaseオプションはいつ適用されますか?

VB6アプリケーションで使用したいCOM可視DLLがC#で記述されています。 DLLの2つの主な使用例があり、/codebaseオプションがいつ適用可能で、いつGACに登録した方がよいか疑問に思っています。


使用例:

  1. DLLは別の開発者PCにロードされ、Project > Referencesメニューの下のVB6 IDEにアクセスできる必要があります

  2. DLLは、VB6アプリケーションがリリースされたときに実稼働マシンにロードされます


/codebaseの適切な使用に関する情報があれば参考になります。

ありがとう。

18
davidk

/ codebaseオプションは、COMサーバーをRegsvr32.exeに登録する方法とまったく同じです。 DLLの特定の場所を選択する必要があり、その場所へのパスがレジストリに書き込まれます。それはriskyであり、COMサーバーは登録がマシン全体に及ぶため、強力なDLL地獄の問題があります。そのDLLを更新すると、サーバーを使用するanyアプリケーションが影響を受けます。多くの場合、良い方法ではありませんが、更新されたサーバーを使用するように再コンパイルされていないアプリが破損することがよくあります。

.NETは、[AssemblyVersion]で選択されたDLLの複数のバージョンを保存できるようにすることで、これを改善しています。 Windowsの並列キャッシュとまったく同じ、マネージアセンブリのGAC。したがって、再構築されなかった古いアプリは影響を受けずに引き続き実行され、古いDLLを使用できます。それは良い方法です。

サーバーの開発で忙しい場合は、/ codebaseの使用をお勧めします。 GACにDLLを登録する追加の必要な手順をスキップできます。そうすることを忘れると苦痛です。テストアプリが古いバージョンをロードするため、変更が機能していないように見えます。/codebaseを使用すると、Regasmは警告を表示し、DLL地獄の可能性について警告します。無視できます。

Visual Studioで[プロジェクト]> [プロパティ]> [ビルド]タブの[COM相互運用機能に登録]チェックボックスを使用して登録を処理すると、Regasm/codebase/tlbとまったく同じになります。このようにすると、古いバージョンのアセンブリが登録解除され、レジストリの汚染を防ぐことができるため、より望ましい方法です。しかし、VSはレジストリに書き込むことができるように昇格して実行する必要があります。

分離COM(「レジストリフリーCOM」とも呼ばれます)を使用するのが最良の方法です。 COMサーバーのコピーをクライアントプログラムと同じディレクトリに保存でき、登録する必要はまったくありません。ただし、クライアントプログラムをいじくり回す必要があります。クライアントアプリを制御できない場合や、他の人がいじりたがるようなアプリの場合は難しいです。たとえば、Microsoft Officeアプリ。

26
Hans Passant