Jeffrey Richtersの本AppliedMicrosoft®.NETFrameworkProgrammingを読んでいるときに、そのトピックに関する興味深いヒントをいくつか見つけました。トピック「共通言語ランタイムのロード(p。41)」に向けて、彼はレジストリパス(およびサブキー)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy
を調べて、インストールされているランタイムをチェックすることに言及しました。したがって、私はそのトピックに向けた興味深いKB記事を見つけました。さらに、「ランタイムが型参照を解決する方法(p。132)」のセクションで、 mscorlib.dllはCLRバージョンに関連付けられていると述べました。したがって、見つかったレジストリキーをこのファイルとそのバージョンと照合して、見つかったキーがCLRバージョンでインストールされていることを確認できるはずです。
以下では、それについての私の結論をコードで見つけることができます。:)Clrverも似たようなことをしていると思います。次のコードはC#であり、非常に基本的なフレームワーク関数を使用しているため、このソリューションはネイティブC++アプリケーションにも適用できるはずです。
List<string> installedRuntimes = new List<string>();
Regex rxVersion = new Regex(@"^[v](\d{1,5})([\.](\d{1,5})){0,3}$");
Regex rxVersionPart = new Regex(@"^\d{1,5}$");
try
{
string installPath = Convert.ToString(Registry.GetKey("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework").GetValue("InstallRoot"));
string[] shortVersions = Registry.GetKey("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/Policy", false).GetSubKeyNames();
foreach (string shortVersion in shortVersions)
if (rxVersion.IsMatch(shortVersion))
{
string[] versionExtensions = Registry.GetKey("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/Policy/" + shortVersion, false).GetValueNames();
foreach (string versionExtension in versionExtensions)
if (rxVersionPart.IsMatch(versionExtension))
{
string fullVersion = shortVersion + "." + versionExtension;
if (rxVersion.IsMatch(fullVersion))
{
string clrPath = installPath + fullVersion + "\\mscorlib.dll";
if (File.Exists(clrPath) && FileVersionInfo.GetVersionInfo(clrPath).FileVersion.StartsWith(fullVersion.Substring(1))) installedRuntimes.Add(fullVersion);
}
}
}
}
catch { } // May fails while getting a specific registry key, if Microsoft changes the naming rules.
(混乱しないでくださいRegistry.GetKey(...)
-.NETレジストリ機能の単なるラッパーであり、レジストリの使用方法に合わせて簡単にできます。)最終的には、installedRuntimes
Clrverリストとしてリスト内にCLRバージョン文字列を含める必要があります。それ。