Используя 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) Когда я пытаюсь создать новый Assembly
для A, я получаю эту ошибку 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
, что приводит к той же ошибке.