3

タイトルが示すように:C#、特にアンマネージ ネイティブ C++ で、インストールされている CLR バージョンを特定する一般的な方法はありますか? これは、この KB 記事に従ってフレームワークがインストールされているかどうかを確認するだけではないことを意味します。ここで CLR1、CLR1.1、および CLR2 に対して行ったように、CLR インターフェイスを使用してそれを実行したいと考えています。このようにして、それらが実際にインストールされていることを確認できます。ただし、これは CLR4 には当てはまりません。何か案は?

私の目標は、 Clrver (プロセス リストの機能に関係なく) のように、利用可能な CLR バージョンの列挙を作成することです。

4

2 に答える 2

5

「一般的な方法」かどうかは別として、 Codeplex の dotNetInstallerはネイティブのアンマネージ C++ コードでこれを行います。
オープンソースなので、彼らのやり方を見てください。

さらに、ICLRMetaHost::EnumerateInstalledRuntimes メソッドを使用して .NET v4+ を検出し、GetRequestedRuntimeInfoInfo ( clrver.cppとほぼ同じ方法) を使用して .NET v1 - v2 を検出できます。したがって、2 つの呼び出しを行う必要がありますが、それで十分です。

于 2012-03-18T13:28:13.717 に答える
-1

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レジストリ機能の単なるラッパーであり、レジストリの使用方法に合わせて簡単にできます。)最終的には、installedRuntimesClrverリストとしてリスト内にCLRバージョン文字列を含める必要があります。それ。

于 2012-04-09T22:46:41.663 に答える