установить базовый класс для проекта сценария Roslyn - PullRequest
1 голос
/ 19 апреля 2020

Итак, у меня есть класс компилятора, который я использую для запуска пользовательского кода. Теперь моя проблема в том, что мои документы являются документами сценариев, и я не знаю, как установить базовый класс для этих документов. я искал hostObjectType, но я увидел, что isSubmission должен быть истинным, но я не могу этого сделать, потому что остальная часть моего кода сломается.

Код для инициализации компилятора:

public static async Task Init(Type host, params Assembly[] assemblies)
{
  await Task.Run(() =>
  {
    IsInitialized = true;
    workspace = new AdhocWorkspace();

    var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, allowUnsafe: true, usings: new string[] { "CCreative" }, platform: Platform.X64)
      .WithMetadataImportOptions(MetadataImportOptions.All);

    var scriptProjectInfo = ProjectInfo.Create(ProjectId.CreateNewId(), VersionStamp.Create(), "Script", "Script", LanguageNames.CSharp, isSubmission: false, hostObjectType: host)
                                       .WithMetadataReferences(assemblies.Select(x => MetadataReference.CreateFromFile(x.Location, default, x.Location.Contains("CCreative") ? new CCreativeDocumentationProvider() : null)))
                                       .WithCompilationOptions(compilationOptions);

    project = workspace.AddProject(scriptProjectInfo);
    workspace.TryApplyChanges(project.Solution.WithOptions(GetOptions(workspace)));
  });
}

поэтому моя цель - установить для базового класса всех документов сценариев параметр host.

Код для создания документа:

public static DocumentId AddDocument(string text)
{
  var scriptDocumentInfo = DocumentInfo.Create(DocumentId.CreateNewId(project.Id),
                                               "Script",
                                               sourceCodeKind: SourceCodeKind.Script,
                                               loader: TextLoader.From(TextAndVersion.Create(SourceText.From(text), VersionStamp.Create())));

  var scriptDocument = workspace.AddDocument(scriptDocumentInfo);

  project = scriptDocument.Project;
  workspace.TryApplyChanges(project.Solution);

  return scriptDocument.Id;
}

Любая помощь будет приветствоваться:)

...