【问题标题】:Determine Needed Assemblies When Compiling C# Project在编译 C# 项目时确定所需的程序集
【发布时间】:2020-02-24 23:18:20
【问题描述】:

我正在为 C# 项目编写元数据提取器。我没有使用 MSBuildWorkspace,而是使用 CSharpSyntaxTree.ParseText() 和 CSharpCompilation.Create()。

检查编译中的诊断信息,我发现我遗漏了一些程序集引用:

_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "netstandard, Version=2.0.0.0" ).Location ) );
_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "System.Runtime" ).Location ) );
_references.Add( MetadataReference.CreateFromFile( typeof( object ).Assembly.Location ) );
_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "System.IO.FileSystem" ).Location ) );
_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "System.Runtime.Extensions" ).Location ) );
_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "System.Collections" ).Location ) );
_references.Add( MetadataReference.CreateFromFile( Assembly.Load( "System.Private.Uri" ).Location ) );

_references 是我在编译中使用的集合:

compilation = CSharpCompilation.Create( ProjectDocument.AssemblyName )
    .AddReferences( _references.ToArray() )
    .AddSyntaxTrees( trees );

trees 是我正在编译的语法树。

我的问题是:有没有办法从语法树或 .csproj 文件中确定需要哪些引用?我通过解析各种<ProjectReference> 节点对添加到项目文件的nuget 包执行此操作。但我不知道如何为其他参考做到这一点。

【问题讨论】:

  • 在您的项目上运行 NuGet 恢复是否可行?如果是,那么听起来project.assets.json 文件可能有你需要的东西
  • 哈哈!谢谢,@ rbennett485;当我出于其他原因解析该文件时,我自己应该想到这一点。如果您提供您的想法作为答案,我很乐意接受它。
  • @rbennett485 我可以推荐你给stackoverflow.com/questions/60404294/…吗?这是一个相关的问题,希望您能对此有所了解。
  • ????恐怕我不确定你的其他问题

标签: c# roslyn-code-analysis microsoft.codeanalysis


【解决方案1】:

如果您可以运行 NuGet 还原,那么 project.assets.json 文件应该包含您需要的所有信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2011-10-14
    • 1970-01-01
    • 2020-03-24
    • 2020-09-09
    相关资源
    最近更新 更多