我正在尝试使用以下代码片段在内存中运行 C# 源代码生成器:
var syntaxTree = await SyntaxTreeFromRelativeFile("testdata/IMyInterface.cs");
var compilation = CSharpCompilation.Create("compilation", ImmutableArray.Create(syntaxTree), References);
var generator = new ProxyGenerator();
GeneratorDriver driver = CSharpGeneratorDriver.Create(generator);
driver = driver.RunGenerators(compilation);
References
设置为编译代码所需的源:
public static readonly ImmutableArray<MetadataReference> References = ImmutableArray.Create<MetadataReference>(
// System
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(GCSettings).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Attribute).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
// JetBrains
MetadataReference.CreateFromFile(typeof(UsedImplicitlyAttribute).Assembly.Location),
// some custom ones
);
虽然生成器以这种方式运行得很好,但遗憾的是它没有达到预期的效果,因为源生成器依赖于一个属性来知道是否为指定类型生成源。确切的来源如下:
[MyAttribute]
public interface IMyInterface { /* ... */ }
源生成器正确获取属性,但它被解析为ExtendedErrorTypeSymbol
结果类型为NotAnAttributeType
. 但是,扩展错误类型符号也有一个候选符号,这是我期望它匹配的确切符号。
这让我感到惊讶,因为显然类型是一个属性,并且作为正常编译的一部分运行源代码生成器实际上确实会生成所有正确的类型。这似乎意味着由于此运行的内存性质而发生了一些奇怪的事情。
据我所知,我的清单References
涵盖了正确认识到某物是属性(、、、和)所需mscorlib
的所有内容System.Runtime
,尽管可能还缺少另一个?netstandard
System.Core
MetadataReference
我确实发现了这个 GitHub 问题,它似乎描述了一个非常相似的问题,即使不是相同的问题。
我很想知道我是否在这里做错了什么,是否还有其他我遗漏的参考资料,或者我是否完全遗漏了其他东西。