特集
Enterprise Library 3.0概説(前編)

自身のセオリーから飛び出した新生EntLib 3.0とは?

アバナード株式会社 市川 龍太(Microsoft MVP − Solutions Architect)
2007/05/22
Page1 Page2 Page3 Page4

・Strong Naming Guidance Package
 あるアセンブリを複数のアプリケーションから利用するなどの理由からGAC(グローバル・アセンブリ・キャッシュ)に登録したい場合があるだろう。その場合アセンブリに厳密名を付ける必要があり、基本的には以下の手順を踏む必要がある。

  1. 任意の名前で秘密/公開キー・ペアを生成する
     秘密/公開キー・ペアを生成するには厳密名ツール(sn.exe)を使えばよい。
     例: sn.exe -k C:\sample.snk

  2. アセンブリに署名する
     アセンブリに署名するには、プロジェクトのプロパティ・ページ内にある署名タブから1で生成したキー・ファイルを設定すればよい。

 アセンブリに厳密名を付けること自体はそれほど難しいことではないのだが、実は厳密名を付けたアセンブリがフレンド・アセンブリ機能を有効にしている場合に、厄介な問題が生じてしまうのである。フレンド・アセンブリ機能とは、本来同一アセンブリ内でのみアクセス可能なInternalメンバに対してほかのアセンブリからでもアクセスできるようにするための機能であり、この機能を有効にするには、公開元アセンブリのAssembly.cs/Assembly.vbファイルにInternalsVisibleTo属性を追加すればよい。

 例: [assembly:InternalsVisibleTo("公開先のアセンブリ名")]

 しかし、公開元のアセンブリに厳密名が付いている場合は、公開先のアセンブリにも厳密名が付いている必要があり、かつ公開元のInternalsVisibleTo属性の第2パラメータに公開先アセンブリの公開キーを指定する必要がある。

 これを行うには先ほど秘密/公開キー・ペアの生成に使用した厳密名ツールに引数「-p」を指定して公開キーを外部ファイルに出力した後に、引数「-tp」に先ほど出力した外部ファイルへのパスを指定して表示される公開キーをInternalsVisibleTo属性に指定することになるだろう。

キー・ファイルから公開キーを表示

 少し前置きが長くなってしまったが、Strong Naming Guidance Packageは、厳密名付きアセンブリにおいてフレンド・アセンブリ機能を使う際の一連の処理を自動化してくれるガインダンス・パッケージなのである(ガイダンス・パッケージについては「Enterprise Library 3.0が見せる共通ライブラリの未来形」を参考にするとよい)。

 それではStrong Naming Guidance Packageの使い方について簡単に解説するとしよう。

 まずEntLib 3.0のインストール時にStrong Naming Guidance Packageもインストールしておく。次にVS 2005を起動しクラス・ライブラリ・プロジェクト(ここでは「SampleLibrary」)とテスト・プロジェクト(ここでは「TestProject1」)を新規作成する。

クラス・ライブラリ・プロジェクトとテスト・プロジェクトで構成
TestProject1プロジェクトからSampleLibraryプロジェクトへ参照を追加しておくこと。

 次にGuidance Package Managerを使ってStrong Naming Guidance Packageを有効化する必要がある。これを行うには、まずVS 2005のメニュー・バーから[ツール]−[Guidance Package Manager]を選択し、Guidance Package Managerを起動する。次に[Enable/Disable Packages]ボタンを押下して表示されるダイアログから[Strong Naming Guidance Package]にチェックを入れ[OK]ボタンを押下する。最後に[Close]ボタンを押下すればStrong Naming Guidance Packageに含まれる以下の2つのRecipe(レシピ:開発者が行う一連の動作をパッケージ化したもの)が有効になる。

  • Create a new strong-name key pair file
    (=キー・ファイルの生成を自動化するRecipe)
  • Strong-name all projects in this solution or solution folder
    (=公開キーが指定されたInternalsVisibleTo属性を自動生成するRecipe)
Guidance Package ManagerでStrong Naming Guidance Packageを有効化
Strong Naming Guidance Packageには以下の2つのRecipeが含まれている。

・Create a new strong-name key pair file
・Strong-name all projects in this solution or solution folder

 次にSampleLibraryアセンブリに厳密名を付ける必要があるため、まず「Create a new strong-name key pair file」の使い方を示す。

 ソリューション・エクスプローラ上のSampleLibraryプロジェクトを選択してからコンテキスト・メニューを表示すると新しく[Create a new strong-name key pair file]が追加されているのが分かるだろう。

ソリューション・エクスプローラのSampleLibraryプロジェクトから表示されるコンテキスト・メニュー
「Create a new strong-name key pair file」が表示される。
  「Create a new strong-name key pair file」はプロジェクト要素を選択したときのみ表示される。

 これを選択して表示されるダイアログの[Key Pair File]テキストボックスに、任意のキー・ファイル名(ここでは「sample.key」)を入力し、[完了]ボタンを押下すると、SampleLibraryプロジェクトに新しくsample.key.snkが追加される。あとは新しく生成されたキー・ファイルを使ってSampleLibraryプロジェクトに署名し(SampleLibraryプロジェクトのプロパティ・ページから「アセンブリの署名」を選択するのが一番簡単な方法である)ビルドすれば、厳密名付きのアセンブリが生成されることになる。

 次に「Strong-name all projects in this solution or solution folder」Recipeを実行するわけだが、その前にSampleLibraryプロジェクトのAssemblyInfo.csファイルに、

[assembly:InternalsVisibleTo("公開先のアセンブリ名(ここでは「TestProject1」)")]

を追加しておく。

 それから先ほど使用したGuidance Package Managerを起動し、「Strong-name all projects in this solution or solution folder」を選択してから[Execute]ボタンを押下する。すると[Target Element Selection]ダイアログが表示されるため、SampleLibraryソリューションが選択されているのを確認してから、[Accept]ボタンを押下し、表示されたダイアログの[Key Pair File]テキストボックスに、先ほど「Create a new strong-name key pair file」Recipeを実行して生成されたキー・ファイル(sample.key.snk)を指定し、[Update InternalsVisibleTo]チェックボックスをチェックしてから、[完了]ボタンを押下する。

 すべての作業が終わってからSampleLibraryプロジェクトのAssemblyInfo.csファイルを開くと、先ほど記述したInternalsVisibleTo属性に公開キーが追加されて、

[assembly:InternalsVisibleTo("公開先のアセンブリ名(ここでは「TestProject1」)"), PublicKey=00240000048000009400…]

となっていることが分かるだろう。

 このようにStrong Naming Guidance Packageを使用すれば、厳密名付きアセンブリでも簡単にフレンド・アセンブリ機能を利用することができるのである。しかしEntLib 3.0のインストーラに、共通ライブラリとしてのEntLibと直接関係のないStrong Naming Guidance Packageが含まれているのはなぜだろうか? これには次のような理由がある。

 EntLibでは各Application Block用プロジェクトに対応するテスト・プロジェクトも一緒に提供されているため、多くのプロジェクトでInternalsVisibleTo属性が定義されている。ここでEntLibをGACへ登録するために厳密名を付けた場合、これら多くのテスト・プロジェクトに対しても厳密名を付ける必要が生じ、かつすでに定義されているInternalsVisibleTo属性にテスト・プロジェクト用アセンブリの公開キーを追加する必要が出てきてしまうことになる。

 EntLibのプロジェクトは数が多いため、これは非常に手間のかかる作業である。EntLib 3.0のインストーラにStrong Naming Guidance Packageが含まれている理由は、この手間を軽減するためにほかならないのである。もちろんStrong Naming Guidance PackageはEntLib以外のプロジェクトにも使えるため、厳密名付きアセンブリでフレンド・アセンブリ機能を使用している場合は使ってみるとよいだろう。

 このようにEntLib 3.0では多くの新機能が追加されているのだが、これらの追加機能は実はまだほんの序の口でしかない。後編では、EntLib 3.0の目玉機能である、

  • Validation Application Block
  • Policy Injection Application Block
  • Application Block Software Factory

について解説する予定である。ご期待いただきたい。End of Article


 INDEX
  [特集]Enterprise Library 3.0概説(前編)
  自身のセオリーから飛び出した新生EntLib 3.0とは?
    1.EntLib 3.0とは?
    2.EntLib 2.0と3.0の相違点
    3.EntLib 3.0から新しく追加された機能(1)
  4.EntLib 3.0から新しく追加された機能(2)
 
  [特集]Enterprise Library 3.0概説(後編)
  EntLib 3.0の注目の新機能を実装サンプルで見てみよう
    1.Validation Application Block(VAB)
    2.VABのSelf Validation機能/ASP.NET統合
    3.Policy Injection Application Block(PIAB)
    4.Application Block Software Factory(ABSF)
 
インデックス・ページヘ  「Enterprise Library」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間