#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.