はじめてのCLRホスティングその2

今回はちょっと寄り道。

HRESULT hr = CorBindToRuntimeEx (
        L"v2.0.50727",
        L"wks",
        STARTUP_CONCURRENT_GC,
        CLSID_CorRuntimeHost,
        IID_ICorRuntimeHost,
        (PVOID*)&pCLR);

CorBindToRuntimeExでCLRのバージョンを指定しています。CLRは同一プロセス(Win32プロセス)上では1つのバージョンしか動作しないので*1、このパラメータはとても重要です。そして、一度ロードされたCLRはプロセス終了までアンロードすることが出来ません。(一応、停止させることは出来ますが、完全にアンロードは出来ず、しかも一度止めたら再開始不能)

さて、このバージョン情報を元にCLRをロードする訳ですが、対象のなるファイルは以下のように手繰られます。

using System;
using System.IO;
using Microsoft.Win32;

class Program {
  static void Main(string[] args) {
    if (args.Length == 0)
      return;

    Version v = new Version(args[0]);
    string ver = String.Format("v{0}.{1}", v.Major, v.Minor);

    RegistryKey keyCheck = null;
    RegistryKey keyNet = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework");
    if (keyNet != null)
      keyCheck = keyNet.OpenSubKey("Policy").OpenSubKey(ver);
    if (keyCheck == null) {
      Console.WriteLine(".NET Framework {0} is not installed.", ver);
      return;
    }

    // .NET Frameworkのルートパス + "v" + "Major.Minor.Build"
    string root = (string)keyNet.GetValue("InstallRoot");
    string path = String.Format(@"{0}v{1}", root, v);
    string engine = Path.Combine(path, "mscorwks.dll");
    if (File.Exists(engine))
      Console.WriteLine(engine);
  }
}

/* clrpath.exe 2.0.50727
 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
 */

上記の場合は、2.0.50727(.NET v2.0)の例です。

通常、.NETアセンブリを実行する場合、デフォルトホストがCorBindToRuntimeExを呼び出していますが、そのときに渡されるバージョンはどのように決定するのでしょうか。

それについてはまた次回。(^^;

*1:AppDomain毎に異なるバージョンのアセンブリをロード出来ることと勘違いし易いですが