我正在为 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 包执行此操作。但我不知道如何为其他参考做到这一点。