Загрузка netstandard MetadataReference под Roslyn недостаточна - PullRequest
0 голосов
/ 10 июля 2020

Я пишу анализатор кода C#, использующий компилятор Roslyn. Компиляция требует указания необходимого MetadataReferences для проекта.

Пример компиляции в написанной мной структуре выглядит следующим образом:

// projModel sets up the compilation environment and does the compilation
var projModel = ServiceProvider.Instance.GetRequiredService<ProjectModel>();

// the framework loads external assemblies via this code:
//    var assembly = _loadContext.LoadFromAssemblyName(new AssemblyName(aName));
//    if (assembly != null)
//        return Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(assembly.Location);
// further code omitted

projModel.ExternalAssemblies.Add( "System.Linq" );
projModel.ExternalAssemblies.Add( "System.Text.RegularExpressions" );
projModel.ExternalAssemblies.Add( "netstandard" );

// projAssets contains all the information from the .csproj file and obj/project.assets.json
// tgtFW is the framework being targeted (e.g., NetCoreApp3.1)
// a return value of true means the compilation succeeded, false means it fails
var result = projModel.Compile( projAssets, tgtFW );

Эта конкретная конфигурация не может быть скомпилирована, потому что компилятор может ' t разрешить ссылки на System.IO.File, который используется в различных местах исходного кода.

Но если я изменю конфигурацию на это:

// projModel sets up the compilation environment and does the compilation
var projModel = ServiceProvider.Instance.GetRequiredService<ProjectModel>();

// the framework loads external assemblies via this code:
//    var assembly = _loadContext.LoadFromAssemblyName(new AssemblyName(aName));
//    if (assembly != null)
//        return Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(assembly.Location);
// further code omitted

projModel.ExternalAssemblies.Add( "System.Linq" );
projModel.ExternalAssemblies.Add( "System.Text.RegularExpressions" );
projModel.ExternalAssemblies.Add( "System.IO.FileSystem" );

// projAssets contains all the information from the .csproj file and obj/project.assets.json
// tgtFW is the framework being targeted (e.g., NetCoreApp3.1)
// a return value of true means the compilation succeeded, false means it fails
var result = projModel.Compile( projAssets, tgtFW );

в основном включая систему .IO.FileSystem вместо сборки netstandard , компиляция завершается успешно.

Что меня смущает, так это то, что я думал, что в документации сказано, включая сборку netstandard вызвало System.IO.FileSystem будет включен автоматически (вместе с множеством других вещей).

Я неправильно понял документацию? Или я не включаю netstandard правильно?

...