c# - C# 使用 SourceGenerator 和 CSharpCompilation
问题描述
主导问题
可以ISourceGenerator
用CSharpCompilation.Create(...)
吗?
背景
我创建了一个基于ISourceGenerator
. 这个生成器使用我不想自己编写的代码创建一些部分类,并且可以从属性和东西生成。它在 VisualStudio 中运行良好。
我还创建了另一个程序,它生成 C# 代码并用于CSharpCompilation.Create(...)
在内存中编译它。
现在我想将两者结合起来,这样后面的程序就可以跳过SourceGenerator在编译代码时会生成的部分。
我知道 SourceGenerators 不稳定,那么这个用例已经实现了吗?
我尝试使用MetadataReference.CreateFromFile(typeof(MyGenerator).Assembly.Location)
并喂它,CSharpCompilation.Create(references: x)
但它没有用 =/
我知道分析器有一个扩展方法WithAnalyzers
,但分析器的工作方式不同......
解决方案
有一个可以使用的 GeneratorDriver API。需要注意的是,在撰写本文时,API 仍被视为测试版并且可能会更改,但我怀疑只要您坚持下面的过程,它应该是好的。
基本上,API 的工作原理是您:
- 调用
CSharpGeneratorDriver.Create
,传入生成器列表。 - 调用您在编译中传递的此方法,它会为您提供一个新的编译,其中添加了生成的树。
推荐阅读
- javascript - 如果语句触发错误警报
- docker - Docker - 如何在集群中的所有其他容器中仅在一个容器中执行计划任务(cron)?
- python - 在python中将文本拆分为单词
- node.js - 如何更新节点js中的会话信息
- delphi - 从 StringList 中的值获取 id
- visual-studio-code - 是否可以为 vs code 编写二进制文件导入扩展名?
- perl - 删除重复后如何在正确的位置结束结果(xml 样式)
- apache2 - linux上的apache2安装:无法纠正问题,你有损坏的包
- javascript - 在引导模式中打开 href
- javascript - Angular:在订阅中设置方法参数