如何用Roslyn加载现有的程序集,转换它并生成新的.cs文件
本文关键字:文件 cs 转换 Roslyn 何用 加载 程序集 | 更新日期: 2023-09-27 18:12:32
似乎关于Roslyn的文档有点缺乏?我找不到好的全面的文档。
我想做的本质上是复制现有API (.dll)的公共表面到一个新的程序集(需要创建源代码.cs文件!),同时对结果代码进行各种转换(考虑制作包装器类)。
将非常感谢任何帮助我如何使用Rolsyn加载初始SyntaxTree从现有的程序集,以及如何做这些基本的转换(例如排除内部类等)
在当前的Roslyn CTP中,有一个Roslyn. services . metadataassource命名空间,可以用来将一个类型的公共接口转换为源代码。这就是我们实现F12"元数据作为源"特性的方式。现在,它只生成源代码的外壳,它实际上不会编译,因此您必须使用进一步的api来将语法树修改为您想要的内容。或者,您可以使用Roslyn.Services.CodeGeneration名称空间从这些符号自动生成源代码。我应该警告MetadataAsSource命名空间可能会在API的未来版本中消失。
您可以通过创建一个添加了您关心的元数据引用的空编译来从元数据中导入符号,然后从该编译中从GlobalNamespace
属性浏览类型层次结构,或者调用Compilation.GetReferencedAssemblySymbol()
然后挖掘它。这实际上比使用反射要好得多,因为它可以从"c#角度"而不是"CLR角度"正确地表达符号模型——反射不会给你dynamic
的使用信息,一些默认参数值,等等。
似乎关于Roslyn的文档有点缺乏?我找不到好的全面的文档。
Roslyn正处于社区技术预览阶段,所以它缺乏文档并不奇怪。你可以在Roslyn API文档中找到一些源代码。
我想做的基本上是将现有API (.dll)的公共表面复制到一个新的程序集(需要创建源代码.cs文件!),同时对结果代码进行各种转换(考虑制作包装器类)。
以这种方式处理组件不是Roslyn可以做的。但是,对于您想要的,用于阅读汇编的反射与用于编写新代码的Roslyn相结合将起作用。但是你需要编写所有的代码来从反射模型转换为Roslyn的模型(例如Type
→TypeDeclarationSyntax
, MethodInfo
→MethodDeclarationSyntax
,等等)。