Roslyn AdhocWorkspace要求参考System.Runtime

jsc*_*eit 6 .net c# roslyn

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

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

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

当我添加以下行时一切正常:

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

我对测试项目中的硬编码路径并不满意,但我不确定如何"获取"4.6.1版本object和Type其他任何方式.下面的代码显示了我的助手的要点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));
Run Code Online (Sandbox Code Playgroud)

更多细节:

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

Pav*_*hev 0

这是因为您使用的是 AdhocWorkspace。据我所知,这个工作区被设计为与 .Net 无关。含义 - 它应该适用于 .Net Standard 和 .Net Core,跨版本。

如果您想跳过与默认库相关的问题,那么使用MSBuildWorkspace可能会更好

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

处理文件 'C:\Path\Myfile.csproj' 时 Msbuild 失败,并显示消息: C:\Path\packages\somepackage\build\somepackage.targets: (75, 2): 已声明或使用“sometask”任务错误或在施工过程中失败。检查任务名称和程序集名称的拼写。

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