7

.NET アセンブリを COM サーバーとして使用できるようにするには、一連の属性を追加してから、regasmそれを COM サーバーとして登録する必要があります。

キーをregasm使用して実行したときにアセンブリが厳密な名前で署名されていない場合、アセンブリが同じコンピューター上の他のアセンブリに干渉する可能性があるため、厳密な名前で署名する必要があるという警告が表示されますが、登録は成功し、正常に動作します。/codebaseRA0000

私の知る限り、厳密な名前は、いわゆる DLL 地獄を防ぐことを目的としています。しかし、COM は DLL 地獄を防ぐことも目的としていました。COM に公開されているインターフェイスを変更する場合は、GUID を変更するか、少なくともバイナリ互換性を維持する必要があります。そのため、厳密な名前で署名しても、何の役にも立たないようです。COM インターフェイスを壊してから、同じキーペアで署名して、本格的な DLL 地獄を持つことを妨げるものは何もありません。

COM に公開された .NET アセンブリの場合、厳密な名前で署名することの用途は何ですか?

4

3 に答える 3

7

不器用な警告です。COM DLL 地獄には 2 つの側面があります。本当に悪いのは、パブリック インターフェイスを変更し、新しい GUID を割り当てないことです。再コンパイルされていないクライアント アプリは、完全に間違ったメソッドを呼び出したり、原因がまったくわからない厄介な AccessViolationException で爆撃したりすると、クラッシュして燃える傾向があります。

2 つ目は、すべて正しく (新しい GUID を割り当てて) 実行しますが、既存の DLL を新しいバージョンで上書きします。その古いクライアント アプリは引き続きクラッシュしますが、原因の診断に役立つかなり具体的な例外を生成する E_NOINTERFACE hresult を使用すると、より緩やかになります。しかし、ユーザーはそれほど幸せではありません。

そのシナリオには .NET ですぐに使えるソリューションがあり、GAC は異なるバージョン番号のアセンブリのサイド バイ サイド展開をサポートしているため、古いバージョンと新しいバージョンの両方が共存でき、古いクライアント アプリは引き続き古いバージョンで問題なく動作します。バージョン。これには強力な名前が必要です。はい、 /codebase を使用すると、GAC を使用しないことが明確になるため、その警告は確かに抑制された可能性があります。/codebase を使用する際に鼻を少し調整しても問題はありませんが。また、テスト中に開発マシンで GAC を使用することはありませんが、デプロイ時には必ず考慮する必要があります。

于 2011-02-01T16:28:45.840 に答える
2

私の知る限り、COM は DLL 地獄を防ぐためのものではなく、Hades 自体の穴でした。「DLL Hell」という用語は、それぞれが同じ名前のメソッドを持つ複数のライブラリの問題に由来しています。システム レジストリに COM アセンブリを登録しても、実行時の解決には役立ちません。

COM サーバーとして機能するアセンブリに署名すると、アセンブリが同じコンピューター上の他の COM 登録済みアセンブリと競合しないことが保証されます。署名がないと、COM に登録された 2 つのアセンブリに同じ名前のメソッドが含まれていると、問題が発生する可能性があります。

于 2011-02-01T16:12:22.390 に答える
1

厳密な名前付けは、主に Dll を GAC に配置するために使用されます。そのため、同じ名前 (!) の複数のバージョンの Dll を同じコンピューター上で安全に使用できますが、通常の COM-Dll では問題が発生することがよくありました。Dll に署名しないと、GAC の機能が削除されます。そのため、差し迫った問題はありませんが、便利な機能を使用していないため、警告が表示されます。

于 2011-02-01T16:12:02.747 に答える