はじめての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を呼び出していますが、そのときに渡されるバージョンはどのように決定するのでしょうか。
それについてはまた次回。(^^;