Я пишу анализатор кода 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 правильно?