从Xamarin.iOS执行在运行时生成的程序集

时间:2016-10-04 09:35:05

标签: c# xamarin.ios interpreter roslyn emit

我正在尝试直接从我正在处理的Xamarin.iOS代码编辑器应用程序生成并执行一些C#代码。我使用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
}

我知道Frank A. Krueger为他那令人敬畏的Continuous应用程序为IL做了一个自定义解释器。

我想有一个类似的方法,但直接来自Roslyn输出的SemanticModelSyntaxTrees因为我只想支持C#。

关于Roslyn非常庞大的代码库,我可以提供一些基于我的解释器的位吗?

另一个问题,如果没有动态生成类型的可能性,我怎样才能在运行时表示那些动态声明的类型?

谢谢!

1 个答案:

答案 0 :(得分:0)

iOS上的生态系统不允许动态生成代码。它也是iOS平台法律限制的一部分。