编译脚本频繁更改

时间:2017-12-19 12:51:34

标签: c# memory-leaks roslyn

我正在研究基于MVVMLight.Messenger和Roslyn脚本的MVVM应用程序模块。想法是为用户提供修改业务逻辑,从对象附加和分离用户脚本的能力。问题是,当您经常更改脚本的可执行代码时,应用程序占用的内存大小会增加。 我使用this answer中的代码。

        var initial = CSharpCompilation.Create("Existing")
       .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
       .AddSyntaxTrees(SyntaxFactory.ParseSyntaxTree(CHANGED_METHOD_BODY));
        var method = initial.GetSymbolsWithName(x => x == "Script").Single();

        // 1. get source
        var methodRef = method.DeclaringSyntaxReferences.Single();
        var methodSource = methodRef.SyntaxTree.GetText().GetSubText(methodRef.Span).ToString();

        // 2. compile in-memory as script
        var compilation = CSharpCompilation.CreateScriptCompilation("Temp")
            .AddReferences(initial.References)
            .AddSyntaxTrees(SyntaxFactory.ParseSyntaxTree(methodSource, CSharpParseOptions.Default.WithKind(SourceCodeKind.Script)));

        using (var dll = new MemoryStream())
        using (var pdb = new MemoryStream())
        {
            compilation.Emit(dll, pdb);

            // 3. load compiled assembly
            assembly = Assembly.Load(dll.ToArray(), pdb.ToArray());
            var methodBase = assembly.GetType("Script").GetMethod(method.Name, new Type[0]);

            // 4. get il or even execute
            MethodBody il = methodBase.GetMethodBody();
            return methodBase;
        }

这是因为我每次编译更改的脚本时都会执行Assembly.Load。旧装配显然仍在CLR中。 是否有任何方法可以实现更改逻辑并防止内存泄漏?

0 个答案:

没有答案