Есть ли общий способ для C # и неуправляемого нативного C ++ определять установленные версии CLR? - PullRequest
3 голосов
/ 18 марта 2012

Как видно из заголовка: существует ли общий способ в C # и особенно неуправляемый нативный C ++ для определения установленных версий CLR? Это означает не просто проверку, установлена ​​ли Framework согласно этой статье базы знаний . Я хочу сделать это с помощью интерфейса CLR, как сделано здесь для CLR1, CLR1.1 и CLR2. Таким образом, я могу убедиться, что они действительно установлены. Но это не относится к CLR4. Есть идеи?

Моя цель - создать список доступных версий CLR, как Clrver (независимо от функциональности списка процессов).

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

«Обычный способ» или нет, но dotNetInstaller в Codeplex делает это в собственном неуправляемом коде C ++.
Так как это с открытым исходным кодом, посмотрите, как они это делают.

Кроме того, вы можете использовать метод ICLRMetaHost :: EnumerateInstalledRuntimes для обнаружения .NET v4 + и GetRequestedRuntimeInfoInfo (почти так же, как clrver.cpp ) для обнаружения .NET v1 - v2. Так что вам нужно сделать два звонка, но это должно покрыть это.

0 голосов
/ 10 апреля 2012

Читая книгу Джеффри Рихтерса Прикладное программирование на 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.

...