如何用内存中引用替换引用?

时间:2019-04-10 14:35:23

标签: c# roslyn

使用Roslyn,我正在一个包含两个项目(A / B)的解决方案中,修改B,然后调用A并期望当A调用B时会得到新的修改结果。

B有Console.WriteLine("Hello");,我想将其更新为Console.WriteLine("Hello World");。这样,当A调用B时,我会在控制台输出中看到Hello World的输出。

1)对于A,我存储CSharpCompilation

2)对于B,我修改了SyntaxTree,对其进行了修改,然后返回新的CSharpCompilation

return CSharpCompilation.Create(
    $"{compilation.AssemblyName}.dll",
    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
    syntaxTrees: modifiedSyntaxTrees,
    references: compilation.References
);

3)然后我将CSharpCompilation用作B并致电ToMetadataReference

4)然后,我在CSharpCompilation.ReplaceReference上调用A,提供步骤3的输出。

5)当我尝试为A创建新的Assembly时,出现此错误BadImageFormatException: Bad IL format.

private static Assembly CreateAssemblyFromCompilation(CSharpCompilation compilation)
{
    Assembly compiledAssembly;
    using (var stream = new MemoryStream())
    {
        var emitResult = compilation.Emit(stream);
        compiledAssembly = Assembly.Load(stream.GetBuffer());
    }

    return compiledAssembly;
}

我也尝试过MetadataReference.CreateFromImage,导致同样的错误。

0 个答案:

没有答案