2016-10-04 4 views
0

J'essaie actuellement de générer et d'exécuter du code C# directement à partir d'une application d'édition de code Xamarin.iOS sur laquelle je travaille. J'utilise Roslyn pour toutes les étapes de compilation, mais malheureusement, Mono ne vous permet pas de charger Assemblies at Runtime sur iOS. Par conséquent, ce code génère généralement une exception Attempting to JIT compile method while running with --aot-only.Exécuter l'assemblage généré à l'exécution à partir de Xamarin.iOS

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 
} 

Je sais que Frank A. Krueger a fait un interprète personnalisé pour IL pour son impressionnante demande Continuous. J'imagine avoir une approche similaire, mais directement à partir de SemanticModel et SyntaxTrees sortie par Roslyn parce que je veux seulement soutenir C#.

En ce qui concerne la base de code assez énorme de Roslyn, y a-t-il quelques bits que je peux ramasser pour fonder mon interpréteur?

Autre question, sans possibilité de générer dynamiquement des types, comment représenter ces types dynamiques déclarés lors de l'exécution?

Merci!

+0

Avez-vous vu le projet Continuous github https://github.com/praeclarum/Continuous du grand Frank? –

Répondre

0

L'écosystème sur iOS n'autorise pas le code généré dynamiquement. Cela fait également partie des restrictions légales pour la plate-forme iOS.