メリット2:GACに登録することができるようになる
厳密名を持つことにより、グローバルアセンブリキャッシュ(GAC)という、昔であれば「Windows\System32」フォルダに共有DLLを入れたかのような、運用をすることが可能になります。
GACに登録することにより、アプリケーションは参照設定を行うものの、アプリケーションフォルダにDLLのローカルコピーを持たなくてもプログラムを実行できるようになります。
GACへのアセンブリの登録は非常に慎重に行うべきですが、COM提供を行う場合などにはGACに入れる方が適切な場合もあります。
メリット3:コードアクセスセキュリティで厳密名による設定が可能になる
今までのプログラムは、インストールするとすべての機能が使い放題でした。例えば、インストールさえ成功してしまえば、Cドライブの配下のファイルをすべて削除するといったこともNTFSのセキュリティ権限次第で可能でした。
.NET Frameworkでは、「プログラムによるファイルへのアクセスをアプリケーションディレクトリのみに限定する」といったコントロールができるようになっています。それがコードアクセスセキュリティ(CAS)という機能です。
このランタイムセキュリティポリシーでは、さまざまな条件でアクセス許可を設定することができます。アセンブリ署名をしていないアセンブリでは、ハッシュやURLなどの条件しか選ぶことができません。
[ハッシュ]を選択した場合にはコンパイルの度に毎回変わってしまうので、バージョンアップする場合には毎回セキュリティポリシーを設定する必要があります。
アセンブリ署名を行っておくと、[厳密な名前]という条件を指定できるようになり、「同じ署名が施されている場合には」という条件でアクセス許可を設定できます。
コードアクセスセキュリティでのアクセス許可の単位
自分で作ったプログラムには、どのアクセス許可が必要なのでしょうか? 実は簡単に調べる必要があります。プロパティの[セキュリティ]タブの中にあるClickOnceセキュリティのアクセス許可という画面です。
この画面の[ClickOnceセキュリティ設定を有効にする]をチェックし、[これは部分的に信頼するアプリケーションです]を選択して、アプリケーションがインストールされるゾーンを[(カスタム)]に変更します。
この状態で[アクセス許可の検出]をクリックすると、次の画面のように必要なアクセス許可が反映されます。コンソールアプリケーションを作成しただけの状態では、SecurityPermissionと、UIPermissionが必要なことを読み取れると思います。
実際に、これらのPermissionはさらに細分化されています。SecurityPermissionを選択してプロパティをクリックした結果が次の画面です。
どのアセンブリも[アセンブリを有効にする]は必須です。これがないと起動することもできなくなります。
このようにアセンブリがどのアクセス許可を必要としているかを調べることができますが、本当に何が必要かは自ら宣言する必要があります。
例えば、自由にCドライブの内容を読み込みたい場合には、次のように宣言します。
[System.Security.Permissions.FileIOPermission( System.Security.Permissions.SecurityAction.Demand, Read = "c:\\")] static void Main(string[] args) { using ( System.IO.FileStream fs = new System.IO.FileStream("c:\\test", System.IO.FileMode.Create)) { fs.WriteByte(0x99); } }
<System.Security.Permissions.FileIOPermission( _ Security.Permissions.SecurityAction.Demand, Read:="c:\")> _ Sub Main() Using fs As New System.IO.FileStream("c:\ test", System.IO.FileMode.Create) fs.WriteByte(153) End Using End Sub
このようにFileIOPermission
を宣言することにより、先ほどの必要なアクセス許可の設定にも反映されるようになります。
このようにCASでプログラムごとに詳細なアクセス許可を設定する場合にも、厳密名を持っているとバージョンアップごとに許可を与える必要がなくなり、運用がしやすくなります。
動くプログラムを提供するだけでなく、動かすために必要なアクセス許可や運用のしやすさなども考慮していきたいです。
さいごに
いかがでしたか? Visual Studio 2005からは、アセンブリ署名を非常に簡単に行えるようになっており、気軽に設定することができます。
本来、アセンブリ署名を行うキーファイルは、ソフトウェア会社に固有となるようにすることが望ましいのですが、厳重な署名の管理を行う必要があるため、難しい場合もあります。そのような場合は署名を行わないというのではなく、プロジェクト単位に署名を行うだけでも、そのメリットは計り知れません。
ぜひあなたのプロジェクトでも、アセンブリ署名の設定を実施してみませんか?