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
等)。