C# 动态创建类到cs文件?
我正在使用AssemblyBuilder创建一个复杂的类,稍后将从该类创建对象。然而,这个类的真正构造方式存在不确定性。那么,有没有办法将这个动态创建的类写入cs文件以供检查C# 动态创建类到cs文件?,c#,.net,dynamic,assemblybuilder,C#,.net,Dynamic,Assemblybuilder,我正在使用AssemblyBuilder创建一个复杂的类,稍后将从该类创建对象。然而,这个类的真正构造方式存在不确定性。那么,有没有办法将这个动态创建的类写入cs文件以供检查 我可以将dll文件写入磁盘,但我需要cs文件。您可以使用 通过JetBrains(免费,来源关闭) 开放源码项目(麻省理工学院许可证来源可从以下网址获得) 通过红门(付费工具,关闭来源) 通过Telerik(Apache许可证上提供的开源反编译引擎免费提供) 还有一个微软的工具 如果您需要编写自定义工具,您可以下载开源
我可以将dll文件写入磁盘,但我需要cs文件。您可以使用
- 通过JetBrains(免费,来源关闭)
- 开放源码项目(麻省理工学院许可证来源可从以下网址获得)
- 通过红门(付费工具,关闭来源)
- 通过Telerik(Apache许可证上提供的开源反编译引擎免费提供)
- 还有一个微软的工具
如果您需要编写自定义工具,您可以下载开源代码并试一试。您是否需要使用
AssemblyBuilder
?我这样问是因为AssemblyBuilder
不允许您在不使用反编译器的情况下查看生成的类,并且如果您生成的类非常复杂,反编译的代码质量就不好。如果使用
Reflection.Emit
,情况几乎相同,因为它会生成低级IL。如果您确实需要查看动态生成的源代码,那么最好的选择是
CodeDom
。下面是一个例子使用Roslyn(又名.NET编译器平台),您可能可以一举两得。你需要这个包裹
首先,您可以使用该类生成语法节点,可以将其组合成更大的结构(成员、方法、类、名称空间、编译单元)。您还可以使用
ToString()
或ToFullString()
(具有正确的缩进和换行符以及所有内容)获得语法节点的良好格式表示,这正是您最初想要的
网上有很多关于如何使用这个API的教程(比如,),还有一个网站可以将一段C代码转换成SyntaxFactory
调用
其次,您可以使用生成的CSharpSyntaxNode
创建一个CSharpSyntaxTree
,您可以在的帮助下将其编译成IL(毕竟,Roslyn是参考C#编译器)。如果需要,您甚至可以将generates程序集发送到流中,从流中获取程序集的二进制数据,并将新创建的程序集加载到当前正在执行的程序集中,并动态实例化刚才定义的类型。您需要使用.NET反射 Ildasm.exe无法帮助您,因为它不会创建所需的.cs文件 因此,
ILSpy
要么是SharpDevelop团队的开源.NET汇编浏览器和反编译器,要么是Jetbrains的dotPeek
根据平台的不同,您也可以选择Mono-Cecil。Cecil是由Jb Evain编写的一个库,用于生成和检查ECMA CIL格式的程序和库
如果您需要速度JustDecompile
,Telerik是一款免费的.NET程序集浏览和反编译工具,据称比竞争对手快10倍
所有这些工具都允许您获取现有的已编译程序集(.dll或.exe)并轻松浏览其中包含的符号,然后同样轻松地将汇编语言反编译回可读的C#和IL 用反编译dll?从我读到的内容来看,反编译文件可能与srouce?@Banshee不太相似,这取决于工具。它们中的一些产生了正常的源代码,可以编译回来。我们还应该提到哪个正在使用ILSpy反编译器,但值得注意的是,richI在过去成功地使用了CodeDOM的更多功能。即使using语句的位置不是最佳的(在类?/Namespace?中,我也记不起与文件级别相反的是哪个),最终产品也是例外。