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)
{
}
}
}
所以,事实证明CSharpCompilationOptions.Usings
只在编译脚本文件时才在编译器中进行检查。如果您跟踪引用,它最终会在这里使用,在if (inScript)
检查中。
我们可能需要更好地记录