Roslyn - CSharpCompilation

本文关键字:CSharpCompilation Roslyn | 更新日期: 2023-09-27 18:12:06

我使用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)
            {
            }
        }
    }

Roslyn - CSharpCompilation

所以,事实证明CSharpCompilationOptions.Usings只在编译脚本文件时才在编译器中进行检查。如果您跟踪引用,它最终会在这里使用,在if (inScript)检查中。

我们可能需要更好地记录

相关文章:
  • 没有找到相关文章