C# 动态创建类到cs文件?

C# 动态创建类到cs文件?,c#,.net,dynamic,assemblybuilder,C#,.net,Dynamic,Assemblybuilder,我正在使用AssemblyBuilder创建一个复杂的类,稍后将从该类创建对象。然而,这个类的真正构造方式存在不确定性。那么,有没有办法将这个动态创建的类写入cs文件以供检查 我可以将dll文件写入磁盘,但我需要cs文件。您可以使用 通过JetBrains(免费,来源关闭) 开放源码项目(麻省理工学院许可证来源可从以下网址获得) 通过红门(付费工具,关闭来源) 通过Telerik(Apache许可证上提供的开源反编译引擎免费提供) 还有一个微软的工具 如果您需要编写自定义工具,您可以下载开源

我正在使用AssemblyBuilder创建一个复杂的类,稍后将从该类创建对象。然而,这个类的真正构造方式存在不确定性。那么,有没有办法将这个动态创建的类写入cs文件以供检查


我可以将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?中,我也记不起与文件级别相反的是哪个),最终产品也是例外。