动态创建 class 到 cs 文件?

Dynamically created class to cs file?

我正在使用 AssemblyBuilder 创建一个复杂的 class,我稍后会从中创建对象。然而,这个 class 的真正构造方式存在不确定性。那么有什么办法可以把这个动态创建的class写成cs文件供检查呢?

我可以将dll文件写入磁盘,但我需要cs文件。

您可以使用

将托管 .NET dll 反编译为 C# 代码
  • DotPeek by JetBrains(免费,资源已关闭)
  • ILSpy open source project (MIT license sources are available at github)
  • Reflector by Red Gates(付费工具,来源已关闭)
  • JustDecompile by Telerik (free with open source decompilation engine available at github Apache 许可证)
  • 还有一个微软的ildasm工具。

如果您需要编写自定义工具,您可以下载开源代码并尝试一下。

您是否有使用 AssemblyBuilder 的要求?我问是因为 AssemblyBuilder 不允许你在不使用反编译器的情况下看到生成的 class,如果你生成的 class 非常复杂,反编译的代码质量不会很好.
如果您使用 Reflection.Emit,您几乎处于相同的情况,因为它会生成低级别的 IL。
如果您真的需要查看动态生成的源代码,最好的选择是 CodeDom。这是一个例子 How to: Create a Class Using CodeDOM

使用 Roslyn(又名“.NET 编译器平台”),您或许可以一箭双雕。您需要 Microsoft.CodeAnalysis.CSharp.

首先,可以使用SyntaxFactoryclass生成语法节点,可以组合成更大的结构(成员、方法、classes、命名空间、编译单元) .
您还可以使用 ToString()ToFullString()(具有正确的缩进和换行符以及所有内容)获得语法节点的格式良好的表示,这正是您最初寻找的。

在线上有很多关于如何使用此 API 的教程(例如 1, 2), and there's the Roslyn Quoter 可以将一段 C# 代码转换为 SyntaxFactory 调用的网站。

其次,你可以使用结果CSharpSyntaxNode创建一个CSharpSyntaxTree,你可以在CSharpCompilation的帮助下编译成IL(毕竟,Roslyn是参考C# 编译器)。
如果需要,您甚至可以将生成的程序集发送到流中,从那里获取程序集的二进制数据,并将新创建的程序集加载到当前正在执行的程序集中,并动态实例化您刚刚定义的类型。

您需要使用 .NET 反射。

Ildasm.exe 无法帮助您,因为它不会创建您需要的 .cs 文件。

因此,ILSpy 是来自 SharpDevelop 团队的开源 .NET 程序集浏览器和反编译器,或者 dotPeek 来自 Jetbrains。

根据平台的不同,您还可以勾选 Mono Cecil。 Cecil 是由 Jb Evain 编写的库,用于生成和检查 ECMA CIL 格式的程序和库。

如果您需要速度 JustDecompile 来自 Telerik 的免费 .NET 程序集浏览和反编译工具声称比竞争对手快 10 倍。

所有这些工具都可以让您使用现有的已编译程序集(.dll 或 .exe)并轻松浏览其中包含的符号,然后同样轻松地将汇编语言反编译回可读的 C# 和 IL。