c# - 使用 Roslyn 以编程方式编译源代码

标签 c# compilation roslyn roslyn-code-analysis

所以我一直在尝试使用 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");

最佳答案

Roslyn 对象是不可变的。

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

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

关于c# - 使用 Roslyn 以编程方式编译源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272830/

相关文章:

c# - 3 和 5 的倍数和不正确

c# - 将 double 格式化为纬度/经度人类可读格式

c# - 停止任务栏闪烁

c++ - 虚拟表中的索引是如何在 C++ 中决定的?

.net - 微软 Roslyn 与 CodeDom

c# - 如何在字符串变量中包含转义序列

java - 在一个项目中只编译一个类

compilation - 如何为堆栈机器编写 LLVM 后端?

c# - 在 Roslyn 项目中创建新文件夹

c# - 使用 Roslyn,从字符串文字参数中找到调用方法