如何在不进行硬编码的情况下获取存储.NET引用程序集的目录的路径?

时间:2017-01-05 04:35:03

标签: c# .net roslyn

C#(或Windows)是否提供了获取包含给定.NET版本的.NET参考程序集的目录位置的方法?在我的机器上,它们位于:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v###\

###是3.5,4.0,4.5,4.5.1,4.5.2,4.6或4.6.1中的任何一个。这些目录包含mscorlib和一些System程序集,而v4.5 +目录在Facades \子目录中也有一些System程序集。

是否有更好的方法来获取这些目录的路径而不是硬编码? (或者,Microsoft是否致力于将参考程序集保持在同一位置,以便硬编码不会破坏?)

(上下文:我正在使用Roslyn来编译一个项目,并且它没有接受我的csproj,框架或其他方面引用的任何程序集 - 所以我将它们作为元数据引用手动加载。我在上面确定的目录是MSBuild从运行csc时获取程序集的位置,所以我想我也应该从那里获取程序集。)

4 个答案:

答案 0 :(得分:2)

使用Microsoft.Build.Utilities.Core中的ToolLocationHelper.GetPathToDotNetFrameworkReferenceAssemblies方法:

foreach (TargetDotNetFrameworkVersion version in Enum.GetValues(typeof(TargetDotNetFrameworkVersion)))
{
    string location = ToolLocationHelper.GetPathToDotNetFrameworkReferenceAssemblies(version);
    Console.WriteLine($"{version}: {location}");
}

答案 1 :(得分:1)

GetPathToDotNetFrameworkReferenceAssemblies返回“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ version \”。

ToolLocationHelper.GetPathToDotNetFrameworkReferenceAssemblies(TargetDotNetFrameworkVersion.VersionLatest);

答案 2 :(得分:1)

如果您在GitHub上查看Microsoft的MSBuild源代码,您可以阅读FrameworkLocationHelper.GetPathToDotNetFrameworkReferenceAssemblies以了解逻辑。

答案 3 :(得分:-1)

Getting the .NET Framework directory path

  

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

     

System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()