連載
» 2006年02月10日 05時00分 UPDATE

.NET TIPS:VSホスト・プロセス(*.vshost.exe)とは何か?[VS 2005のみ、C#、VB]

[一色政彦,デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 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ホスト・プロセス(*.vshost.exe)とは何か?

 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でデバッグ中の実行プロセスの名前の確認 VS 2005でデバッグ中の実行プロセスの名前の確認
VSホスト・プロセスを有効にしたVS 2005でデバッグを開始すると、「<アセンブリ名>.exe」ファイルのプロセスではなく、「<アセンブリ名>.vshost.exe」ファイルのプロセスが利用されることになる。
  (1)[Ctrl]+[Alt]+[Del]キーを押すなどして「Windows タスク マネージャ」を起動し、その[プロセス]タブを開く。
  (2)VSホスト・プロセスを有効にしたVS 2005でアプリケーションをデバッグ実行すると、このように*.vshost.exeファイルのプロセスが利用されていることが分かる。
  (3)通常の状態(もしくはVSホスト・プロセスを無効にしたVS 2005など)で、アプリケーションをデバッグ実行すると、このように*.exeファイルのプロセスが利用されていることが分かる。

 VS 2005では、このように.NETアプリケーションをホストするプロセスを切り替えることで、デバッグ機能の改善・強化を実現しているわけである。具体的には、主に次の3点の改良を実現している。

  • デバッグ・パフォーマンスの向上
  • デザイン時の式評価
  • 部分信頼アプリケーションのデバッグ

 これらの各項目について、以降でもう少し詳しく解説していこう。

VSホスト・プロセスを活用したデバッグ機能の改善・強化

●デバッグ・パフォーマンスの向上

 前述したように.NETアプリケーションを実行するとアプリケーション・ドメインが作成されることになるが、.NETアプリケーションをデバッグする場合にはさらにデバッガをそのアプリケーション・ドメインに関連付ける必要がある(当然ながらこれらの作業はIDEが自動的に行う)。そして、これら一連のデバッグ準備作業は、非常に時間を要することがある。

 にもかかわらず従来のVS.NETでは、アプリケーションがいったん終了すると、一連のデバッグ準備作業でせっかく作成したアプリケーション・ドメインとそれに対するデバッガの関連付けは消失してしまっていたのだ。そのため、再度、デバッグを開始する際には、再び最初からデバッグ準備作業を実行せねばならず、無駄に開発者の時間が浪費されるという問題が生じていたわけである。

 VSホスト・プロセスはこの問題を解決してくれる。VSホスト・プロセスを有効にしたVS 2005のIDEでは、(次の画面のように)デバッグを開始する前からバックグラウンドでアプリケーション・ドメインの作成とそれに対するデバッガの関連付けを行い、アプリケーションを実行している間にアプリケーション・ドメインおよびデバッガの関連付けの状態を保存する。これにより、デバッグの開始が飛躍的に高速になるわけだ(実際にVS 2005でデバッグを実行してみると、従来のVS.NETと比べて早くなったことが実感できるだろう)。

VSホスト・プロセスの作動 VSホスト・プロセスの作動
VSホスト・プロセスを有効にしたVS 2005のIDEでは、デバッグを開始する前からバックグラウンドでアプリケーション・ドメインの作成とそれに対するデバッガの関連付けを行う。また、アプリケーションを実行している間にアプリケーション・ドメインおよびデバッガの関連付けの状態を保存する。これによりデバッグの開始が早くなる。
  (1)VS 2005のIDEでプロジェクトを新規作成した直後(もしくは開いた直後)からVSホスト・プロセスはバックグラウンドで作動している。

●デザイン時の式評価

 VS 2005のIDEに搭載された新しいフィーチャに「デザイン時の式評価」(Design-Time Expression Evaluation)がある。これは、アプリケーションを実行していない段階で(つまり、まだデザインやコーディングを行っている最中に)[イミディエイト]ウィンドウに任意のメソッドなどの一部のコードを手動で入力することで、そのコードを即座に実行させて動作を検証できる機能のことだ。その際、メソッド内にブレークポイントを設定しておけば、そこで実行をブレークさせることもできる。

 この機能はVisual C# 2005 Express EditionやVisual Basic 2005 Express Editionでも利用できる。次の画面は、実際にVisual C# 2005 Express Editionの[イミディエイト]ウィンドウからデザイン時の式評価を実行しているところだ。

VSホスト・プロセスによるデザイン時の式評価 VSホスト・プロセスによるデザイン時の式評価
[イミディエイト]ウィンドウでは、コーディングやデザイン中に任意のコードを実行できる。ただしプロジェクトを正常にビルドできなければ、デザイン時の式評価はエラーになる。[イミディエイト]ウィンドウは、メニュー・バーの[デバッグ]−[ウィンドウ]−[イミディエイト]を選択すると表示される。なおVBでは[イミディエイト]ウィンドウ内でもIntelliSenseが使えるが、残念ながらC#では利かないようだ。
  (1)[イミディエイト]ウィンドウへ任意のコード(この例では「MessageBox.Show("メッセージも表示できる!");」)を入力し、[Enter]キーを押す。
  (2)バックグラウンドでプロジェクトがビルドされた後、即座にコードが実行される(この例ではメッセージボックスが表示されている)。

 この画面に示した[イミディエイト]ウィンドウのデザイン時の式評価でも、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 2005における部分信頼アプリケーションの設定 VS 2005における部分信頼アプリケーションの設定
VSホスト・プロセスの機能により、VS 2005では部分信頼アプリケーションもデバッグ可能だ。この画面はVS 2005のプロジェクトのプロパティ・ページを開いたところ。プロジェクトのプロパティ・ページは、[ソリューション エクスプローラ]でプロジェクトに含まれる「Properties」(C#の場合)もしくは「My Project」(VBの場合)をダブルクリックするか、メニュー・バーの[プロジェクト]−[<プロジェクト名> のプロパティ]を実行すればよい。
  (1)プロジェクトのプロパティ・ページの[セキュリティ]タブを開く。
  (2)[ClickOnce セキュリティ設定を有効にする]チェックボックスにチェックを入れる。
  (3)[これは部分的に信頼するアプリケーションです]ラジオボタンを選択する。
  (4)[アプリケーションがインストールされるゾーン]コンボボックスから適切なゾーンを選択する。この例では「(カスタム)」を選択している。
  (5)[アプリケーションで必要なアクセス許可]一覧の各[設定]コンボボックスで設定したいアクセス許可を(「(ゾーン既定値)」「必要」「必要なし」の中から)選択する。
  (6)[アクセス許可の検出]ボタンをクリックすると、現在のプロジェクトのソース・コードから自動判別してアクセス許可の要/不要を一括設定できる。
  (7)[詳細設定]ボタンをクリックすると、[セキュリティの詳細設定]ダイアログが表示される。
  (8)[セキュリティの詳細設定]ダイアログで[このアプリケーションを選択されたアクセス許可のセットでデバッグする]チェックボックスにチェックを入れておくと(デフォルトでチェックはオンになる)、部分信頼アプリケーションのデバッグが可能になる。

 この[セキュリティ]タブから表示できる[セキュリティの詳細設定]ダイアログで[このアプリケーションを選択されたアクセス許可のセットでデバッグする]チェックボックスにチェックを入れておくと(デフォルトでチェックはオンになる)、デバッグ時にVSホスト・プロセスによって、部分信頼のアプリケーションのセキュリティ・コンテキストを持つアプリケーション・ドメインが作成されるため、部分信頼アプリケーションのデバッグができるようになる。

 ここで試しに([このアプリケーションを選択されたアクセス許可のセットでデバッグする]チェックボックスのチェックを入れたままの状態で)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();
    }
  }
}

Win32ホスト・プロセスとVSホスト・プロセスで結果が異なる例(C#)
このコンソール・アプリケーションを実行すると、その出力結果が、Win32ホスト・プロセスでは「ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null」となり、VSホスト・プロセスでは「mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089」となる。

VSホスト・プロセスを無効化するには?

 最後にVSホスト・プロセスを無効化する手順を紹介しよう。これには、VS 2005のIDEで次の画面の手順を実行すればよい。

VSホスト・プロセスを無効化する手順 VSホスト・プロセスを無効化する手順
VSホスト・プロセスを無効化するには、[Visual Studio ホスティング プロセスを有効にする]チェックボックスのチェックを外すだけだ。
  (1)VS 2005のプロジェクトのプロパティ・ページを開く。これには、[ソリューション エクスプローラ]でプロジェクトに含まれる「Properties」(C#の場合)もしくは「My Project」(VBの場合)をダブルクリックするか、メニュー・バーの[プロジェクト]−[<プロジェクト名> のプロパティ]を実行すればよい。
  (2)プロジェクトのプロパティ・ページの[デバッグ]タブを開く。
  (3)[Visual Studio ホスティング プロセスを有効にする]チェックボックスのチェックをオフにする。

 以上でVSホスト・プロセスは無効になる。だが基本的には、VSホスト・プロセスを無効にすること(またその必要性)はほとんどないだろう。

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Visual Studio 2005 処理対象:IDE


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。