【问题标题】:C# Roslyn to use previously compiled class in next compilationsC# Roslyn 在下一次编译中使用以前编译的类
【发布时间】:2019-03-15 15:29:23
【问题描述】:

我举个例子, 假设我有以下代码。

fullcommand = @"public class oldTest
{
    public static void oldTestMethod(){
        Console.WriteLine(""oldTest Class"");
    }
}"

var syntaxTree = CSharpSyntaxTree.ParseText(fullCommand);
var compilation = CSharpCompilation.Create(
                assemblyName,
                new[] {syntaxTree},
                references,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,allowUnsafe:true));

var ms = new MemoryStream();
var result = compilation.Emit(ms);

我将在内存中使用 Roslyn 编译上述代码。 接下来我想在内存中编译另一个代码来使用上面编译的类,让我们说下面。

new_fullcommand = @"public class newTest
    {
        public static void newTest(){
            oldTest.oldTestMethod();
        }
    }"

    var syntaxTree = CSharpSyntaxTree.ParseText(new_fullcommand);
    var compilation = CSharpCompilation.Create(
                    assemblyName,
                    new[] {syntaxTree},
                    references,
                    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,allowUnsafe:true));

    var ms = new MemoryStream();
    var result = compilation.Emit(ms);

如何使第二个代码使用第一个代码作为参考?还是使用它?

【问题讨论】:

    标签: c# roslyn in-memory runtime-compilation


    【解决方案1】:

    最简单的方法可能是在创建编译时传入多个 syntaxTree 对象。

    但是,如果您想逐步构建编译,我相信您可以将Compilation.AddSyntaxTrees 用于您的第一个compilation 对象。

    【讨论】:

    • 我做不到,我需要单独编译 SyntaxTrees,因为我不知道即将发布的代码。
    • 我发现这非常相关,但我无法让它工作。 stackoverflow.com/questions/38646619/… 知道如何解决吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2023-03-25
    • 2013-07-06
    • 1970-01-01
    • 2018-02-14
    • 2011-12-12
    相关资源
    最近更新 更多