Можно ли включить intellisense для объекта global из globalsType в элемент управления RoslynPad RoslynCodeEditor?

Я работал с элементом управления RoslynCodeEditor и пытался найти способ передать мой глобальный объект в RoslynCodeEditor и иметь в моих скриптах intellisense.

Кто-нибудь знает, как я могу предоставить доступ к свойствам или методам объекта контекста при редактировании моего скрипта с помощью элемента управления RoslynCodeEditor?

MyContext context = new MyContext();
context.Data = data;
ScriptOptions scriptOptions = ScriptOptions.Default;
scriptOptions = scriptOptions.WithReferences(ReferencesAndImports.References);
scriptOptions = scriptOptions.WithImports(ReferencesAndImports.Imports);
var scriptState = await CSharpScript.EvaluateAsync<string>("int i = 0;", scriptOptions, context, typeof(MyContext));

1 ответ

Решение

Вам нужно добавить тип globals в компиляцию времени разработки. Для этого вам понадобится кастом RoslynHost (поддерживается в версии 2.4 и выше):

public class CustomRoslynHost : RoslynHost
{   
    protected override Project CreateProject(Solution solution, DocumentCreationArgs args, CompilationOptions compilationOptions, Project previousProject = null)
    {
        var name = args.Name ?? "Program";
        var id = ProjectId.CreateNewId(name);

        var parseOptions = new CSharpParseOptions(kind: SourceCodeKind.Script, languageVersion: LanguageVersion.Latest);

        compilationOptions = compilationOptions.WithScriptClassName(name);

        solution = solution.AddProject(ProjectInfo.Create(
            id,
            VersionStamp.Create(),
            name,
            name,
            LanguageNames.CSharp,
            isSubmission: true,
            parseOptions: parseOptions,
            hostObjectType: typeof(MyContext),
            compilationOptions: compilationOptions,
            metadataReferences: previousProject != null ? ImmutableArray<MetadataReference>.Empty : DefaultReferences,
            projectReferences: previousProject != null ? new[] { new ProjectReference(previousProject.Id) } : null));

        var project = solution.GetProject(id);

        return project;
    }
}

Затем добавьте ссылку на сборку, в которой находится тип. Например:

new CutomRoslynHost(
    references: RoslynHostReferences.Default.With(
        typeNamespaceImports: new[] { typeof(MyContext) }),
    additionalAssemblies: ...);
Другие вопросы по тегам