看起来Roslyn周围的文档有点缺乏? 我无法找到好的综合文档。
我想要做的主要是复制现有API的公共表面(.dll) 进入一个新的程序集(需要创建源代码.cs文件!),同时对结果代码进行各种转换(想想制作包装类)。
非常感谢有关如何使用Rolsyn从现有程序集加载初始SyntaxTree以及如何执行这些基本转换(例如排除内部类等)的任何帮助
答案 0 :(得分:3)
在当前的Roslyn CTP中,有一个Roslyn.Services.MetadataAsSource命名空间,可用于将类型的公共接口转换为源代码。这就是我们实现F12“元数据作为源”功能的原因。现在,它只生成一个实际上不会编译的源代码shell,所以你必须使用更多的API来将语法树变成你想要的。或者,您可以使用Roslyn.Services.CodeGeneration命名空间自动从这些符号生成源。我应警告MetadataAsSource命名空间可能会在API的未来版本中消失。
您可以通过使用您关注的元数据引用创建一个空的编译来从元数据导入符号,然后从该编译中浏览GlobalNamespace
属性中的类型层次结构,或者调用Compilation.GetReferencedAssemblySymbol()
然后挖掘那个。这实际上比使用反射要好得多,因为它将从“C#透视图”而不是“CLR透视图”正确表达符号模型 - 反射不会为您提供dynamic
的使用信息,有些默认参数值等
答案 1 :(得分:1)
看起来Roslyn周围的文档有点缺乏?我无法找到好的综合文档。
Roslyn正处于社区技术预览阶段,因此缺少其文档并不奇怪。您可以在Roslyn API documentation找到一些来源。
我本来要做的就是将现有API(.dll)的公共表面复制到新的程序集中(需要创建源代码.cs文件!),同时对其进行各种转换。结果代码(想想制作包装类)。
以这种方式使用程序集不是Roslyn可以做的事情。但看起来你想要的东西,阅读装配与Roslyn结合编写新代码的反思是可行的。但是您需要编写所有代码以从反射模型转换为Roslyn的模型(例如Type
→TypeDeclarationSyntax
,MethodInfo
→MethodDeclarationSyntax
等。)。