Visual Studio 2005(以降、VS 2005)で、C#やVB(Visual Basic)の新規プロジェクトを作成すると、その出力フォルダ(具体的には「bin\Debug」フォルダと「bin\Release」フォルダ)内に「<アセンブリ名>.vshost.exe」(以降、「*.vshost.exe」と表記)というファイルが自動的に生成される。
例えば、「WindowsApplication1」というアセンブリ名のWindowsアプリケーションを作成する場合、(「WindowsApplication1.exe」というアセンブリ・ファイルのほかに)「WindowsApplication1.vshost.exe」というファイルが自動生成される。これは従来のVisual Studio .NET(以降、VS.NET)では生成されなかったファイルである。
このような*.vshost.exeファイルの「vshost」は「the Visual Studio HOSTing process」を意味する。つまりこのファイルは、Visual Studioホスティング・プロセス(以降、VSホスト・プロセス)を実現するためのものなのである。それではこのVSホスト・プロセスとはいったい何なのだろうか。これについて本稿では解説する。
VSホスト・プロセスは、デバッグ作業を改善・強化するために、VS 2005で新たに追加された新機能の1つだ。
通常(もしくは、従来のVS.NETなどから)、.NETアプリケーションが実行されると、.NETの実行エンジンであるCLRローダ(=.NETランタイム)がWin32ホスト・プロセス(=現在プログラムが実行されている、Win32システム上のプロセス)内に読み込まれ、同時に既定(デフォルト)のアプリケーション・ドメイン(AppDomain)が自動的に作成される。このアプリケーション・ドメインとは「.NET専用のプロセス」のことで、.NETアプリケーションのマネージ・コードはこのアプリケーション・ドメイン上で実行されることになる。
しかしVS 2005でVSホスト・プロセスが有効になっている場合(デフォルトで有効。有効/無効に設定する方法は後述する)、.NETアプリケーションのデバッグの際には、Win32ホスト・プロセス(つまり*.exeファイルの持つプロセス)の代わりに、VSホスト・プロセス(つまり*.vshost.exeファイルのプロセス)が利用されるようになる。
この事実は、次の画面のように、VS 2005でデバッグ中にタスク・マネージャでプロセス名を調べれば簡単に確認できる。
VS 2005では、このように.NETアプリケーションをホストするプロセスを切り替えることで、デバッグ機能の改善・強化を実現しているわけである。具体的には、主に次の3点の改良を実現している。
これらの各項目について、以降でもう少し詳しく解説していこう。
前述したように.NETアプリケーションを実行するとアプリケーション・ドメインが作成されることになるが、.NETアプリケーションをデバッグする場合にはさらにデバッガをそのアプリケーション・ドメインに関連付ける必要がある(当然ながらこれらの作業はIDEが自動的に行う)。そして、これら一連のデバッグ準備作業は、非常に時間を要することがある。
にもかかわらず従来のVS.NETでは、アプリケーションがいったん終了すると、一連のデバッグ準備作業でせっかく作成したアプリケーション・ドメインとそれに対するデバッガの関連付けは消失してしまっていたのだ。そのため、再度、デバッグを開始する際には、再び最初からデバッグ準備作業を実行せねばならず、無駄に開発者の時間が浪費されるという問題が生じていたわけである。
VSホスト・プロセスはこの問題を解決してくれる。VSホスト・プロセスを有効にしたVS 2005のIDEでは、(次の画面のように)デバッグを開始する前からバックグラウンドでアプリケーション・ドメインの作成とそれに対するデバッガの関連付けを行い、アプリケーションを実行している間にアプリケーション・ドメインおよびデバッガの関連付けの状態を保存する。これにより、デバッグの開始が飛躍的に高速になるわけだ(実際にVS 2005でデバッグを実行してみると、従来のVS.NETと比べて早くなったことが実感できるだろう)。
VS 2005のIDEに搭載された新しいフィーチャに「デザイン時の式評価」(Design-Time Expression Evaluation)がある。これは、アプリケーションを実行していない段階で(つまり、まだデザインやコーディングを行っている最中に)[イミディエイト]ウィンドウに任意のメソッドなどの一部のコードを手動で入力することで、そのコードを即座に実行させて動作を検証できる機能のことだ。その際、メソッド内にブレークポイントを設定しておけば、そこで実行をブレークさせることもできる。
この機能はVisual C# 2005 Express EditionやVisual Basic 2005 Express Editionでも利用できる。次の画面は、実際にVisual C# 2005 Express Editionの[イミディエイト]ウィンドウからデザイン時の式評価を実行しているところだ。
この画面に示した[イミディエイト]ウィンドウのデザイン時の式評価でも、VSホスト・プロセスが活用されている。試しにVSホスト・プロセスを無効にすると、クラス・ライブラリのプロジェクトではデザイン時の式評価が無効になる。それ以外の実行可能ファイルを生成するようなプロジェクト(例えばWindowsアプリケーションやコンソール・アプリケーションなど)の場合、VSホスト・プロセスの代わりに、Win32ホスト・プロセス(正式な.EXEファイル)が利用されて、デザイン時の式評価が動作することになる。
ちなみにVS 2005 Standard Edition以降の上位エディションに搭載されているVS 2005の新機能の「オブジェクト・テスト・ベンチ」(Object Test Bench)も、この[イミディエイト]ウィンドウのデザイン時の式評価によって実現されている機能である。
従来のVS.NETでは、完全な信頼(Full Trust)の権限が割り当てられていない部分信頼(Partial Trust)アプリケーションをデバッグすることは不可能だった。
このため、コード・アクセス・セキュリティ(CAS:Code Access Security)によるアクセス許可制限のかかったアプリケーション(例えば従来のノータッチ・デプロイメントによってイントラネット/インターネットから配布された「部分的に信頼されたアプリケーション」など)はデバッグできず、コード・アクセス・セキュリティ(やノータッチ・デプロイメント)を活用したアプリケーションの開発をより難しくしていた。
しかしVS 2005では、VSホスト・プロセスの機能により、部分信頼アプリケーションもデバッグできるようになった。
具体的には次の画面のように、VS 2005のプロジェクトのプロパティ・ページの[セキュリティ]タブから部分信頼の権限(=アクセス許可セット)をアプリケーション自体に設定できる。
ここで部分信頼のセキュリティ設定をした状態でユーザーにアプリケーションを配布すると、自動的に制限されたセキュリティ・コンテキスト上でアプリケーションが実行されることになる。
この[セキュリティ]タブから表示できる[セキュリティの詳細設定]ダイアログで[このアプリケーションを選択されたアクセス許可のセットでデバッグする]チェックボックスにチェックを入れておくと(デフォルトでチェックはオンになる)、デバッグ時にVSホスト・プロセスによって、部分信頼のアプリケーションのセキュリティ・コンテキストを持つアプリケーション・ドメインが作成されるため、部分信頼アプリケーションのデバッグができるようになる。
ここで試しに([このアプリケーションを選択されたアクセス許可のセットでデバッグする]チェックボックスのチェックを入れたままの状態で)VSホスト・プロセスを無効にしてみると、アプリケーションをデバッグしようとしても部分信頼の状態でデバッグすることはできないことが分かるだろう。このことから、部分信頼アプリケーションをデバッグするには、とにかくVSホスト・プロセスが不可欠なことが分かる。
以上見てきたように、VSホスト・プロセス(*.vshost.exe)とはVS 2005のデバッグで活用される機能である。この*.vshost.exeファイルは、VS 2005のIDEなしで、直接に実行することはできない。そのため、ユーザー環境に“*.vshost.exe”や“*.vshost.exe.config”を配布しても意味がないし、すべきではない。
また、VSホスト・プロセス(*.vshost.exe)上でアプリケーションを実行する場合、実際のWin32ホスト・プロセス(*.exe)上でのアプリケーションと動作が若干異なる個所があることに注意してほしい。
具体的には次に示すプロパティの値が異なる可能性がある。
最初のAppDomain.CurrentDomain.FriendlyNameプロパティはアプリケーション・ドメインの表示名を返す。VSホスト・プロセス上で実行されている場合は、当然ながらVSホスト・プロセスの名前(*.vshost.exe)を返すことになる。このため、例えば通常のWin32ホスト・プロセスで実行した場合には「WindowsApplication1.exe」であるところが、「WindowsApplication1.vshost.exe」となってしまう。
次のAssembly.GetCallingAssembly().FullNameプロパティはアセンブリの表示名を返す。通常は正しいアセンブリ名を返すが、VSホスト・プロセス上で実行されている場合に「mscorlib」を返してしまうケースがある。
例えば次に示すコードを実行した場合、通常のWin32ホスト・プロセスの場合は「ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null」であるところが、VSホスト・プロセスでは「mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089」のようになってしまう。
using System;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
Assembly.GetCallingAssembly().FullName);
Console.ReadLine();
}
}
}
最後にVSホスト・プロセスを無効化する手順を紹介しよう。これには、VS 2005のIDEで次の画面の手順を実行すればよい。
以上でVSホスト・プロセスは無効になる。だが基本的には、VSホスト・プロセスを無効にすること(またその必要性)はほとんどないだろう。
利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Visual Studio 2005 処理対象:IDE
Copyright© Digital Advantage Corp. All Rights Reserved.