Uncategorized

GAC の中の dll

こんにちは。

.NET のベテラン開発者の方にとっては当たり前のことですが、最近 .NET をはじめられた方のために、以下に、GAC (Global Assemby Cache) についての予備知識をいくつか記載しておきます (.NET の上級開発者の方は以下は読まなくて充分です)。

Visual Studio をインストールした環境で GAC の中の物理ファイル (dll) をエクスプローラからのぞこうとすると、ファイルとしてではなく、アセンブリとしての情報が表示されているかと思います。これは、.NET Framework SDK とよばれるものが拡張している機能で、Visual Studio などをインストールすることでこの SDK がインストールされます。

この中の dll ですが、この状態ではファイルとして扱うことはできません。ファイルとして参照できないと、開発の際にアセンブリの参照ができないわけですが、Visual Studio のソリューションエクスプローラを右クリックして [参照の追加] を実行してもらうとわかりますが、.NET のコードを作成する際に参照する dll (開発時に使う dll) は GAC の中を直接参照するのではなく、開発用に参照できるように所定のパスに保管されており、これが参照で使用されています (web.config などの構成を編集すると、直接GACのアセンブリを参照できます)。しかし、登録されているアプリケーションによっては、dll を GAC だけに登録してしまい、開発用に参照するための dll は保持されていないといったケースもあり得ます。Reflector などを使って、GAC の中に登録されている dll の中をどうしてもみたくなる場合などもこれでは困ってしまうことでしょう (私は、仕事がらよくアセンブリの中身を見ていますが、開発者の方もたまに必要になることでしょう)。
こうした場合には、例えば、コマンドプロンプト (cmd.exe) が使用できます。コマンドプロンプトでは、上記の拡張機能が有効ではないので、GAC の中のフォルダ構成がそのまま参照でき、フォルダ (C:\Windows\assembly など) の中のサブフォルダ (GAC_MSIL など) から該当の dll を探したら、あとは copy コマンドなどを使って dll を取り出すことができます。

誤解のないように記載しておきますが、エクスプローラで GAC がみれなくなっているのは、上述のように、セキュリティ上の理由ではありません。便利さを提供するためのものです。
他にも方法があるかもしれませんが、「便利が故の小さな不便」は、例えばこのようにして回避できるわけです。
基礎系の講座 (セミナー) ではいつもご説明していますが、この例のように、パスワードなど重要な文字列をアセンブリに含めて利用者に配ると、エンジニアは簡単にその中を参照できてしまいます。ですから、たとえ難読化ができるとしても、こうした重要な情報を含めてエンドユーザなど不特定多数に配布することは、モデルを変更するなどして極力避けてください。これは何も .NET に限らず、ポータビリティに優れた言語すべてで共通に言えることです。(さらに言えば、たとえバイナリとしてコンパイルされたものであっても、アセンブラを解釈することで処理を参照できてしまいますので、同様です。)

なお、アセンブリは、参照する順番として、必ず GAC の中のものが codebase よりも先に参照されます。しかしデバッグ実行などでは、キャッシュに保管された dll を参照していることがありますので、参照の矛盾などが発生した場合には (例:普通に実行すると GAC に登録したアセンブリが参照されて正しく動作するが、デバッグ実行するとキャッシュのアセンブリが使われて正しく動かない、など)、システムドライブの Documents and Settings\[ユーザID]\Local Settings\Application Data (Vista の場合にはパスが異なります) の下から該当のアセンブリを探して削除すると回避できます。

Categories: Uncategorized

Leave a Reply