Roslyn AdhocWorkspace要求参考System.Runtime

时间:2017-11-05 19:03:23

标签: c# .net roslyn

我正在尝试对一些C#代码进行语义分析。 为我的测试设置AdhocWorkspace时,我发现了一些示例,指向使用Typeobject上的装配位置。 当我这样做时,我的诊断中出现以下错误:

  

[0]:TestIsNotInstanceOfTypeMessage.cs(13,20):错误CS0012:类型'Object'在未引用的程序集中定义。您必须添加对程序集'System.Runtime,Version = 4.0的引用。 0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。

     

[1]:TestIsNotInstanceOfTypeMessage.cs(13,13):错误CS0012:类型'Type'在未引用的程序集中定义。您必须添加对程序集'System.Runtime,Version = 4.0的引用。 0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。

当我添加以下行时,一切运作良好:

MetadataReference.CreateFromFile(@"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\v4.6.1\\Facades\\System.Runtime.dll"),

我对测试项目中的硬编码路径并不满意,但我不确定如何以任何其他方式“获取”objectType的4.6.1版本。 下面的代码显示了我的助手的要点,以获得AdhocWorkspace

private static readonly ImmutableArray<MetadataReference> _coreReferences = 
ImmutableArray.Create<MetadataReference>(
MetadataReference.CreateFromFile(typeof(Type).Assembly.Location),
MetadataReference.CreateFromFile(typeof(object).Assembly.Location)


private static readonly Project _baseProject = new AdhocWorkspace()
    .AddProject("Test", LanguageNames.CSharp)
    .AddMetadataReferences(_coreReferences)
    .WithCompilationOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

更多细节:

  • Visual Studio Community v15.4.0
  • Target framework: .NET 4.6.1
  • Microsoft.CodeAnalysis.CSharp v2.4.0
  • 主项目是一个控制台应用程序,测试项目是一个常规库,也不是PCL

1 个答案:

答案 0 :(得分:0)

这是由于您正在使用AdhocWorkspace。据我所知,此工作区被设计为与.Net无关。含义-它应同时适用于.Net Standard和.Net Core交叉版本。

如果您想跳过与默认库相关的问题,最好使用MSBuildWorkspace

但是,此工作空间依赖于计算机上安装的MSBuild,以及其他一些MSBuild特定的东西,这很可能导致其他问题。喜欢:

Msbuild在处理文件“ C:\ Path \ Myfile.csproj”时出现以下消息失败:消息:C:\ Path \ packages \ somepackage \ build \ somepackage.targets:(75,2):“ sometask”任务已被声明或错误使用,或在构建期间失败。检查任务名称和程序集名称的拼写。

如果要坚持使用AdHoc工作区,则必须使用注册表手动找到引用,方法是使用注册表找到.Net程序集文件夹,或者转向GAC。换句话说,如果您想将解决方案中的AdHoc空间与.Net标准相关联,则可以这样做,但是您可以自己决定。