Я пишу экстрактор метаданных для проектов С#. Я не использую 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, какие именно ссылки необходимы? Я делаю это для пакетов nuget, добавленных в файл проекта, анализируя различные узлы <ProjectReference>
. Но я не уверен, как это сделать для других ссылок.
project.assets.json
может иметь то, что вам нужно. - person rbennett485   schedule 25.02.2020