Выполнить сборку, созданную во время выполнения из Xamarin.iOS

#c# #xamarin.ios #interpreter #roslyn #emit

#c# #xamarin.ios #интерпретатор #рослин #испускать

Вопрос:

В настоящее время я пытаюсь сгенерировать и выполнить некоторый код на C # непосредственно из приложения-редактора кода Xamarin.iOS, над которым я работаю. Я использую Roslyn для всех этапов компиляции, но, к сожалению, Mono не позволяет загружать сборки во время выполнения на iOS.

Таким образом, этот код обычно генерирует Attempting to JIT compile method while running with --aot-only исключение.

 var tree = CSharpSyntaxTree.ParseText(@"public Foo
{
    public void Bar() { Console.WriteLine(""""foo"""");
}");

var compilation = CSharpCompilation.Create(
        "Generated."   Guid.NewGuid(),
        syntaxTrees: new[] { tree },
        references: references,
        options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

using (var ms = new MemoryStream())
{
    var result = compilation.Emit(ms);          
    var assembly = Assembly.Load(ms); // <- Thrown here
}
  

Я знаю, что Фрэнк А. Крюгер создал пользовательский интерпретатор для IL для своего потрясающего непрерывного приложения.

Я предполагаю, что у меня есть аналогичный подход, но непосредственно из SemanticModel и SyntaxTrees , выведенный Roslyn, потому что я хочу поддерживать только C #.

Что касается довольно огромной кодовой базы Roslyn, есть ли какие-то биты, на которых я могу использовать свой интерпретатор?

Другой вопрос, без возможности динамически генерировать типы, как я мог бы представлять эти динамические объявленные типы во время выполнения?

Спасибо!

Комментарии:

1. Вы видели непрерывный github github.com/praeclarum/Continuous проект от великого Фрэнка?

Ответ №1:

Экосистема iOS не допускает динамически генерируемого кода. Это также является частью юридических ограничений для платформы iOS.