Как заменить ссылку на ссылку в памяти? - PullRequest
1 голос
/ 10 апреля 2019

Используя 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, что приводит к той же ошибке.

...