使用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
,导致同样的错误。