Roslyn - CSharpCompilation

时间:2014-07-09 15:54:19

标签: c# roslyn

我正在使用CSharpCompilation类来编译SyntaxTree,其中根是类声明。我传递给构造函数一个CSharpCompilationOptions对象,其中包含我的using语句。

我的理解是语法树将使用我传递的任何using语句的上下文进行编译。但是,当尝试访问在“使用”中的一个中定义的类时,可以使用'我传递给选项对象我得到一个错误,说它在当前上下文中不存在。

我显然做错了什么。传递给CSharpCompilationOptions类时,有人知道使用列表是什么吗?

这是代码:

public static void TestMethod()
    {
        string source = @"public class Test
{
    public static void TestMethod()
    {
        string str = Directory.GetCurrentDirectory();
    }
}";
        SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source);

        List<string> usings = new List<string>()
        {
            "System.IO", "System"
        };
        List<MetadataFileReference> references = new List<MetadataFileReference>()
        {
            new MetadataFileReference(typeof(object).Assembly.Location),
        };   

        //adding the usings this way also produces the same error
        CompilationUnitSyntax root = (CompilationUnitSyntax)syntaxTree.GetRoot();
        root = root.AddUsings(usings.Select(u => SyntaxFactory.UsingDirective(SyntaxFactory.IdentifierName(u))).ToArray());
        syntaxTree = CSharpSyntaxTree.Create(root);

        CSharpCompilationOptions options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, usings: usings);
        CSharpCompilation compilation = CSharpCompilation.Create("output", new[] { syntaxTree }, references, options);

        using (MemoryStream stream = new MemoryStream())
        {
            EmitResult result = compilation.Emit(stream);

            if (result.Success)
            {
            }
        }
    }

1 个答案:

答案 0 :(得分:7)

因此,事实证明在编译脚本文件时,只在编译器中检查过CSharpCompilationOptions.Usings。如果您浏览引用,最终会在if (inScript)项检查中使用here

我们可能需要更好地记录。