厳密な名前付け
厳密な名前付けとは、キーを使用してアセンブリに署名し、厳密な名前付きアセンブリを生成することを指します。 アセンブリが厳密な名前を持つ場合、名前とアセンブリのバージョン番号に基づいて一意の ID が作成され、アセンブリの競合を防ぐことができます。
厳密な名前付けの欠点は、アセンブリの厳密な名前付け後に、Windows 上の .NET Framework によってアセンブリの厳密な読み込みが可能になる点です。 厳密な名前付きのアセンブリの参照は、読み込まれたアセンブリのバージョンと完全に一致する必要があります。その場合、開発者には、アセンブリを使用する際にバインド リダイレクトの構成が強制されます。
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
.NET 開発者が厳密な名前付けについて文句を言うとき、それは通常、アセンブリの読み込みが厳格すぎることについての不満です。 幸い、この問題は .NET Framework に分離されています。 .NET 5 以降、.NET Core、UWP、およびその他のほとんどの .NET 実装には厳密なアセンブリ読み込みがないため、厳密な名前付けの主な欠点です。
.NET Framework での厳密な名前付けの重要な側面の 1 つは、ウイルス性があるということです。厳密な名前付きアセンブリは、他の厳密な名前付きアセンブリのみを参照できます。 ライブラリに厳密な名前が付いていない場合、厳密な名前付けが必要な .NET Framework アプリとライブラリでは使用できません。
.NET Framework での厳密な名前付けの利点は次のとおりです。
- アセンブリは、他のストロング ネーム付きアセンブリによって参照および使用されることができます。
- アセンブリは、グローバル アセンブリ キャッシュ (GAC) に格納できます。
- アセンブリは、他のバージョンのアセンブリと並べて読み込むことができます。 一般に、サイド バイ サイド アセンブリの読み込みは、プラグイン アーキテクチャを使用するアプリケーションで必要になります。
厳密な名前付けには、.NET Core/5 以降には利点はありません。 C# コンパイラは、厳密な名前付きのアセンブリが厳密な名前付きでないアセンブリを参照している場合に CS8002 警告を生成します。 .NET Core/5 以降のみを対象とするライブラリでは、この警告を抑制しても問題ありません。
厳密な名前付き .NET ライブラリを作成する
ターゲットに .NET Framework または .NET Standard が含まれている場合は、オープン ソースの .NET ライブラリに厳密な名前を付ける必要があります。 .NET Core/5 以降のみを対象とするライブラリでは、厳密な名前付けは必要ありません。
手記
このガイダンスは、NuGet.org で公開されている .NET ライブラリなど、パブリックに配布された .NET ライブラリに固有です。ほとんどの .NET アプリケーションでは厳密な名前付けは必要ありません。既定では行うべきではありません。
✔️ ライブラリのアセンブリに厳密な名前付けすることを検討してください。
✔️ ソース管理システムに厳密な名前付けキーを追加することを検討してください。
公開されているキーを使用すると、開発者は同じキーを使用してライブラリのソース コードを変更および再コンパイルできます。
過去に特別なアクセス許可を付与するために使用されたことがある場合、部分信頼シナリオでは、強力な名前付けキー
を公開しないでください。 そうしないと、既存の環境が侵害される可能性があります。
重要
コードの発行元の識別を求める場合は、Authenticode および NuGet パッケージ署名 を使用することが推奨されます。 コード アクセス セキュリティ (CAS) は、セキュリティ軽減策として使用しないでください。
✔️ ユーザーがバインド リダイレクトを減らし、更新される頻度を減らすのに役立つメジャー バージョンの変更に対してのみアセンブリ バージョンをインクリメントすることを検討してください。
のバージョン管理とアセンブリバージョンのの詳細を参照してください。
❌ 厳密な名前付けキーを追加、削除、または変更しないでください。
アセンブリの厳密な名前付けキーを変更すると、アセンブリの ID が変更され、それを使用するコンパイル済みコードが中断されます。 詳細については、バイナリ互換性を破壊する変更を参照してください。
❌ ライブラリのストロングネーム付きバージョンとそうでないバージョンを併せて発行しないでください。 たとえば、Contoso.Api
と Contoso.Api.StrongNamed
などです。
2 つのパッケージを発行すると、開発者のエコシステムがフォークされます。 また、アプリケーションが両方のパッケージに依存するようになると、開発者は型名の競合に直面する可能性があります。 .NET に関する限り、それらはアセンブリごとに異なる型です。
.NET