強力な名前付きアセンブリを使用する理由


107

厳密な名前付きアセンブリを使用する利点は何ですか?

通常のアセンブリではできないことは何ですか?

回答:


92

最初にアセンブリに厳密な名前を付けることの利点を挙げましょう。

  1. アセンブリに厳密な名前を付けると、アセンブリをグローバルアセンブリキャッシュ(GAC)に含めることができます。したがって、複数のアプリケーション間で共有することができます。

  2. 厳密な名前を付けると、そのアセンブリの一意の名前が保証されます。したがって、他のユーザーが同じアセンブリ名を使用することはできません。

  3. 厳密な名前は、アセンブリのバージョン系統を保護します。厳密な名前を付けると、アセンブリの後続バージョンを誰も作成できないようにすることができます。アプリケーションユーザーは、ロードするアセンブリのバージョンが、アプリケーションのビルドに使用されたバージョンを作成したのと同じ発行元からのものであることを確認します。

Microsoft による厳密な名前付けの詳細については、厳密な名前付きアセンブリMSDN)を参照してください。


1
項目4でよろしいですか?多分この行動は最近変わったと思います。厳密に命名されたアセンブリの読み込みを変更して失敗させようとしましたが、問題なく読み込まれました。
Jens

19
#4に関しては不正解です。改ざんから保護するようには設計されていません。詳細については、blogs.msdn.com / b / shawnfa / archive / 2005/12/13 /…を参照してください。
Colin Bowern、2013年

1
@ RobV8R依存関係の90%はオープンソースであり、秘密鍵は(Microsoftの推奨に従って)公開gitリポジトリにあり、それらを必要とするすべての人が利用できます。
トランプスター

1
@ RobV8Rここで侵害された単語は使用できません。これは、そもそも秘密であることを意図していることを意味します。マイクロソフトのガイドラインでは、秘密鍵は公開ソースリポジトリに保管する必要があります。秘密鍵は、意図的に公開されたものではありません。秘密鍵が既知であり、親プロジェクトのオープンソースコードを変更する人が使用することを意図している場合(そうでない場合、多くの場合、ライセンスに違反します)、これを行う人は異なるバージョン番号を使用しますが、この鍵は同じですバインディングリダイレクトが必要な場合。
トランプスター

1
@ RobV8R私が最初に得たのは、多くの人が、強い名前付けによって依存関係がアセンブリの特定のバージョンにロックされていることを保証していると信じていることです。同じ秘密鍵で署名されました。そして私が言ったように、秘密鍵はほとんどの依存関係のために意図的に公開されています。
トランプスター

9

通常のアセンブリではできないことは何ですか?

Nugetの台頭から始まったすべての議論は、強力な名前付きアセンブリを完全に取り除くことを示唆していたので、私の会社はそれを試み、アプリケーション設定に関しては動作の大幅な変更に遭遇しました。

VisualStudio(System.Configuration.ApplicationSettingsBaseを継承)によって提供される自動アプリまたはユーザースコープのアプリケーション設定を使用する場合、EXEという名前の厳密な名前のEXEは、%LOCALAPPDATA%内に正確に1つのディレクトリを作成します。あります。

ただし、厳密な名前がない場合、EXEの場所(=パス)は、DEBUGとRELEASEビルドですでに異なるハッシュ値を作成するために使用され、「YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf」のような名前の%LOCALAPPDATA%内に多くのディレクトリを作成します。これにより、更新ごとにインストールディレクトリが変化するClickOnce配置では使用できなくなります。


5

厳密な名前がないと、構成ファイルでバインディングリダイレクトを使用できないことを追加します。

これは機能しません:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

公開鍵トークンが必要です

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

9
厳密な名前を使用しない場合、バインドリダイレクトは必要ありません。
トランプスター2017

0

ほんの一例です。私は、セキュリティをより重視して答えを出したいと思います。サードパーティで再利用したくないが、テスト可能にしたいソースコードを使用してアセンブリを作成する場合は、アセンブリに強く署名し、内部のアセンブリを、同じ署名。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.