c# - Roslyn AdhocWorkspace 要求引用 System.Runtime

标签 c# .net roslyn

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

[0]: TestIsNotInstanceOfTypeMessage.cs(13,20): error CS0012: The type 'Object' is defined in an assembly that is not referenced.You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

[1]: TestIsNotInstanceOfTypeMessage.cs(13,13): error CS0012: The type 'Type' is defined in an assembly that is not referenced.You must add a reference to assembly '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"),

我对测试项目中的硬编码路径不太满意,但不确定如何“获取”4.6.1 版本的 objectType any另一种方式。 下面的代码显示了我的助手获取 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
  • 目标框架:.NET 4.6.1
  • Microsoft.CodeAnalysis.CSharp v2.4.0
  • 主工程是控制台应用,测试工程是普通库,PCL都不是

最佳答案

这是因为您使用的是 AdhocWorkspace。据我所知,此工作区旨在与 .Net 无关。意思是——它应该适用于.Net Standard 和.Net Core,交叉版本。

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

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

Msbuild 在处理文件“C:\Path\Myfile.csproj”时失败,消息为:C:\Path\packages\somepackage\build\somepackage.targets: (75, 2): The "sometask"任务声明或使用不正确,或在构造过程中失败。检查任务名称和程序集名称的拼写。

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

关于c# - Roslyn AdhocWorkspace 要求引用 System.Runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47125443/

相关文章:

c# - 在 C# 中创建 TemplateControl

c# - OWIN 启动 : Entry point was not found

c# - 为什么 Task 对象不可重用?

c# - 复制文件,如果较新则覆盖

.net - 将解决方案更新到.net Framework 4.7 : issue with Roslyn

c# - 如何在没有 "not found to remove"异常的情况下获取重命名类的语义模型

C# 4.0 可选参数 - 如何指定类型为 "Guid"的可选参数?

.net - 在哪里可以找到 .NET Framework 附带的程序集的明确列表?

.net - 将 WF4 实例存储数据库从生产环境复制到开发环境?

.net - 通过Roslyn API读取默认命名空间