【问题标题】:Programmatically compiling source code using Roslyn使用 Roslyn 以编程方式编译源代码
【发布时间】:2016-02-08 15:09:09
【问题描述】:

所以我一直在尝试使用 Roslyn 以编程方式编译一段代码。由于某些原因,我添加的引用并没有出现在 Compilation 类中。因此,当我在使用“AddReferences”后查看引用的程序集时,列表为空。因此,当我尝试发射时,我得到诊断中未定义的“对象”。谁能指出我的问题?

Microsoft.CodeAnalysis.SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"
public static class Program
{
    public static void Main()
    {
        System.Console.WriteLine(""Hello"");            
    }
}
");
    string autoreferences = @"mscorlib.dll,System.Core.dll";
    List<string> usings = new List<string>();
    string netAssembliesDirectory = Path.GetDirectoryName(typeof(object).Assembly.Location);
    var refs = new List<string>();
    foreach (string reference in autoreferences.Split(','))
        refs.Add(netAssembliesDirectory + "\\" + reference);


    CSharpCompilation compilation = CSharpCompilation.Create("ConsoleTest")
        .WithOptions(
            new CSharpCompilationOptions(OutputKind.ConsoleApplication).WithUsings("System"))
        .AddSyntaxTrees(syntaxTree);
    compilation.AddReferences(refs.Where(r => r != "").Select(r => MetadataReference.CreateFromFile(r)));
    var er = compilation.Emit(@"C:\" + "ConsoleTest");

【问题讨论】:

    标签: c# compilation roslyn roslyn-code-analysis


    【解决方案1】:

    Roslyn 对象是不可变的。

    compilation.AddReferences() 返回带有这些引用的新编译实例。
    你忽略了那个新实例。

    您需要在有您的引用的编译实例上调用Emit()

    【讨论】:

    • 谢谢。有点让我吃惊。考虑到正在发生的反射器图案,我想我应该已经弄清楚了。
    • 是否必须解析 using 子句的源代码并使用 WithUsing 添加它们?这对我来说有点奇怪。
    • @FarhadAlizadehNoori:不; WithUsing 允许您使用适用于所有文件的语句添加项目级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2015-11-04
    • 1970-01-01
    • 2023-04-08
    • 2011-12-20
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多