获取.NET Framework目录路径


Answers:


181

可以使用以下方法获取当前.NET应用程序激活的CLR的安装目录的路径:

System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()

强烈建议您不要直接阅读注册表。例如,当.NET应用程序在64位系统上运行时,可以从“ C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727”(AnyCPU,x64编译目标)或从“ C:\”加载CLR。 Windows \ Microsoft.NET \ Framework \ v2.0.50727”(x86编译目标)。读取注册表不会告诉您当前CLR使用了两个目录中的哪个目录。

另一个重要事实是,对于.NET 2.0,.NET 3.0和.NET 3.5应用程序,“当前CLR”将为“ 2.0”。这意味着即使在.NET 3.5应用程序(从3.5目录加载其某些程序集)中,GetRuntimeDirectory()调用也将返回2.0目录。根据您对术语“ .NET Framework目录路径”的解释,GetRuntimeDirectory可能不是您要查找的信息(“ CLR目录”与“ 3.5程序集来自的目录”)。


2
我相信这是正确的答案,应该选择它。感谢您澄清以下事实:即使在3.0或3.5应用程序上,GetRuntimeDirectory始终返回2.0文件夹。在大多数情况下,这是您要访问框架工具的正确行为,该工具在2.0中(但在3.0 3.5中则不是)。
DSO

如何在64位系统上获得x86和x64 .NET框架的InstallRoot?即使在64位系统上,“ [HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot”是否始终指向x86版本的.NET?我需要使用非托管应用程序获取此文件夹的路径,因此无法使用上面列出的方法。谢谢。
Paya)

1
可能最简单的方法是创建微型.NET应用程序,其中一个针对x86编译(例如“ getdotnetpath32.exe”),而另一个针对x64编译(例如“ getdotnetpath64.exe”)。托管应用程序将使用GetRuntimeDirectory()调用并将其写入STDOUT(Console.Output)。然后,非托管应用程序将启动x86的子进程(getdotnetpath32.exe),将其STDOUT连接到其内存中流并读取该进程产生的结果。然后它将启动x64的子进程(getdotnetpath64.exe),将其STDOUT连接到其内存中的流,并读取该进程产生的结果
Milan Gardian

1
如果您想要存储配置文件的目录的路径,可以执行以下操作:var readFromDirectory = System.IO.Path.GetDirectoryName(System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile); var mediumTrustConfigPath = System.IO.Path.Combine(readFromDirectory,“ web_mediumtrust.config”);
亚历克斯·诺克利夫

41

一种更简单的方法是包括Microsoft.Build.Utilities程序集并使用

using Microsoft.Build.Utilities;
ToolLocationHelper.GetPathToDotNetFramework(
        TargetDotNetFrameworkVersion.VersionLatest);

听起来好多了,尤其是在使用会影响构建过程的工具时。
乔纳森·艾伦

我想这不适用于.NET Core和.NET 5.0吗?

2

您可以从Windows注册表中获取它:

using System;
using Microsoft.Win32;

// ...

public static string GetFrameworkDirectory()
{
  // This is the location of the .Net Framework Registry Key
  string framworkRegPath = @"Software\Microsoft\.NetFramework";

  // Get a non-writable key from the registry
  RegistryKey netFramework = Registry.LocalMachine.OpenSubKey(framworkRegPath, false);

  // Retrieve the install root path for the framework
  string installRoot = netFramework.GetValue("InstallRoot").ToString();

  // Retrieve the version of the framework executing this program
  string version = string.Format(@"v{0}.{1}.{2}\",
    Environment.Version.Major, 
    Environment.Version.Minor,
    Environment.Version.Build); 

  // Return the path of the framework
  return System.IO.Path.Combine(installRoot, version);     
}

资源


11
我强烈建议您不要直接访问注册表(在64位操作系统上,这实际上可能会给出错误的答案)。请参阅下面的详细信息。
米兰·加迪安

1
同意@Milan-绝对不推荐。
安迪·约翰逊

@CMS我想像silvetlight版本一样做。如果我要删除注册表项,则意味着软件也将从系统中卸载。谢谢
Dhru'soni 2015年

0

对于> = 4.5的.NET Framework版本,可以使用MSDN的官方方法

internal static class DotNetFrameworkLocator
{
    public static string GetInstallationLocation()
    {
        const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
        using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
        {
            if (ndpKey == null)
                throw new Exception();

            var value = ndpKey.GetValue("InstallPath") as string;
            if (value != null)
                return value;
            else
                throw new Exception();
        }
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.