写真●マイクロソフト デベロッパー&プラットフォーム開発ツール製品部の鈴木祐巳エグゼクティブプロダクトマネージャ(撮影:皆木優子)
写真●マイクロソフト デベロッパー&プラットフォーム開発ツール製品部の鈴木祐巳エグゼクティブプロダクトマネージャ(撮影:皆木優子)
[画像のクリックで拡大表示]

 ソフトウエア開発者向けイベント「XDev2009」2日目の2009年9月16日,「Javaユーザーにも聞いてほしい,今だから理解する『.NET Framework』」と題し,マイクロソフト デベロッパー&プラットフォーム開発ツール製品部の鈴木祐巳エグゼクティブプロダクトマネージャ(写真)が講演した。

 今回の講演の目的について,同氏は次のように説明した。.NETとJavaの両方が浸透した今,どちらかがなくなるという状況は考えられず,両方を学ばなければならない。その場合,Javaだけを知っている開発者は,どこから.NETを学習すべきかわからない場合がある。そこで今回の講演では,そうした開発者を念頭において,.NETの前提となる知識を学んでもらおうというのが趣旨だとした。

.NET Frameworkの実体は「CLR+ライブラリの集まり」

 本題に入る前に同氏は,「.NET」と「.NET Framework」が混同されがちだと指摘した。一言で言うと,今回の講演のテーマである.NET Frameworkは,.NETの一部である。.NETは幅広い構想でサーバーも含まれる。.NET Frameworkは,それを実現するためのフレームワークの実装であるとした。

 続いて同氏は.NET Frameworkの構造について説明した。.NET Frameworkの実体を分かりやすく言えば,「CLR+ライブラリの集まり」だという。もう少し詳しく説明すると,.NET Frameworkは,「CLR」(common language runtime),「BCL」(base class library),「solution framework」の3層で構成される。

 CLRはベースとなるランタイムで,BCLは基本的なデータやクラス・ライブラリである。Solution Frameworkはアプリケーションを開発するフレームワークで,ASP.NET/Ajax,WPF,Windowsフォームなどが含まれる。例えば,Windowsアプリケーションを開発する場合はWindowsフォームを利用することになる。

プログラムの状態は三つ,それらをつなぐ二つのコンパイラ

 次に同氏は,.NET Frameworkでプログラムが実行される過程を説明した。.NET Frameworkでは,プログラムは「ソースコード」「アセンブリ」「ネイティブ」の三つの状態をとる。それぞれの間に二つのコンパイラが介在することになるという。

 テキストで書かれたソースコードは,Visual Studioや各種SDKといった言語別コンパイラによって,いったんアセンブリに変換される。アセンブリは,CLRのJITコンパイラによって,実行対象となるネイティブのコードに変換される。

 .NETで使われるプログラミング言語としては,標準言語,スクリプト言語,サードパーティ製言語がある。標準言語としては,Visual Basic(VB)とC#の二つが使われる。スクリプト言語としては,JScriptなど20~30種類以上が利用できるという。これらの言語ごとにコンパイラがあるが,そこから生成されるアセンブリに使われる中間言語(MSIL)は一つである。

“DLL地獄”を避ける厳密なアセンブリのバージョン管理

 アセンブリは,アプリケーションを作る部品のようなもので,具体的にはDLLやEXEのことであると同氏は述べた。アプリケーション開発で見ると,Visual Studioのプロジェクト単位であり,セキュリティの観点で見ると,「実行できるかどうか」を管理する単位でもあるという。

 アセンブリの特徴の一つは,名前として一般的な「簡易名」とは別に,「厳密名」を持っていることだという。以前は,あとからインストールしたアプリケーションによって,同じ名前のDLLが上書きされてしまうという問題があった。いわゆる「DLL地獄」(DLL hell)である。こうした問題を避けるため,.NET Frameworkでは,バージョン情報などを厳密名に含めることで,同じDLLでもバージョンが異なれば上書きされないような仕組みにした。

 アセンブリの配置場所としては,任意のディレクトリと「GAC」(global assembly cache)の2種類がある。GACは,複数のアプリケーションが共通利用するDLLを管理するための場所である。例えば,名前が同じ「Example.dll」だがバージョンが異なる二つのdllをGACに置き,それぞれ異なるアプリケーションが使い分けることが可能となる(サイド・バイ・サイド実行)。

コード・グループ単位で設定可能なセキュリティ

 .NET Frameworkのセキュリティには,「コード・アクセス・セキュリティ」と「ロール・ベース・セキュリティ」の二つがある。後者は,役割に応じてユーザーを「ロール」にグループ化し,その単位でセキュリティを管理する一般的な手法だという。これに対し,前者のコード・アクセス・セキュリティは,.NET Frameworkで特徴的な機能である。

 従来のユーザー・ベースのセキュリティでは,ユーザーごとに「さわれるか,さわれないか」を決める,いわば“オール・オア・ナッシング”のやり方だった。これに対し,.NET Frameworkのコード・アクセス・セキュリティでは,「コード・グループ」という特定の条件ごとのグループを導入し,アクセス許可セットと対応付けている。「例えば,ローカル(マイコンピュータ),イントラネット,インターネットといったゾーンごとにグループを設定し,それらに対して異なるアクセス許可設定を施すことが可能である。インターネットからダウンロードしたEXEはローカルにはさわれない,といった使い方ができる」(鈴木氏)。