Roslyn:CSharpCompilerOptions WithUsings 的效果

Roslyn: Effect of CSharpCompilerOptions WithUsings

我的问题是关于 CSharpCompilerOptionsusing 语句传递给 CSharpCompilation 的实例。

我有一个从一些文本中解析出来的语法树:

SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@"
            namespace RoslynCodeAnalysis
            {
                using System;
                using System.Net; // Commenting this out causes errors

                public class Writer
                {
                    public void Write(string message)
                    {
                        WebClient client = new WebClient();
                        Console.WriteLine(message); 
                    }
                }
            }");

CSharpCompilation 实例创建如下。为简单起见,我没有包括参考,但它确实添加了对 System.Net 和其他一些常见程序集的引用。

CSharpCompilation compilation = CSharpCompilation.Create(
            assemblyName,
            syntaxTrees: new[] { syntaxTree },
            references: references,
            options: new CSharpCompilationOptions(
                       OutputKind.DynamicallyLinkedLibrary, 
                       usings: new List<string> { "System", "System.Net" }));

问题是,如果我使用 System.Net 注释掉,我会收到错误消息:

CS0246: The type or namespace name 'WebClient' could not be found (are you missing a using directive or an assembly reference?)

这可能是什么原因造成的?传递给 CSharpCompilation 的选项将 usings 属性 设置为 System 和 System.Net。这是正常行为还是我遗漏了什么?即使指定了 usings 属性 ,源文本仍然需要有 using 语句?我很确定我错过了什么!

这用于脚本,而不是普通的文件编译。

如果您通过 Roslyn 源跟踪 属性 的用法,您最终会得到 here,它在交互式管道中使用(这就是 Submission 的含义)。