Читая книгу Джеффри Рихтерса Прикладное программирование на Microsoft® .NET Framework Я нашел несколько интересных советов по этому вопросу. К теме Загрузка общеязыковой среды выполнения (стр. 41), которую он упомянул для проверки пути к реестру (и подразделов) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy
для проверки установленных сред выполнения. Поэтому я нашел интересную статью KB на эту тему. Кроме того, в разделе Как во время выполнения решаются ссылки на тип (стр. 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, чтобы упростить его для того, как я привык использовать реестр.) В конце концов у вас должны быть строки версии CLR внутри списка installedRuntimes
, как его перечисляет Clrver.