我正在使用 AssemblyBuilder 创建一个复杂的类,我稍后会从中创建对象。然而,如何真正构建这个类存在不确定性。那么有没有办法将这个动态创建的类写入cs文件进行检查呢?
我可以将 dll 文件写入磁盘,但我需要 cs 文件。
我正在使用 AssemblyBuilder 创建一个复杂的类,我稍后会从中创建对象。然而,如何真正构建这个类存在不确定性。那么有没有办法将这个动态创建的类写入cs文件进行检查呢?
我可以将 dll 文件写入磁盘,但我需要 cs 文件。
您可以使用将托管的 .NET dll 反编译为 C# 代码
如果您需要编写自定义工具,您可以下载开源代码并尝试一下。
你有使用要求AssemblyBuilder
吗?我问是因为AssemblyBuilder
不允许您在不使用反编译器的情况下查看生成的类,并且如果您生成的类非常复杂,则反编译的代码质量不会很好。
如果您使用它,您几乎处于相同的情况,Reflection.Emit
因为它会生成低级别的 IL。
如果您确实需要查看动态生成的源代码,最好的选择是CodeDom
. 这是一个示例如何:使用 CodeDOM 创建一个类
您可以使用 Roslyn(又名“.NET 编译器平台”)用一块石头杀死两只鸟。你需要这个包Microsoft.CodeAnalysis.CSharp
。
首先,您可以使用SyntaxFactory
类生成语法节点,您可以将其组合成更大的结构(成员、方法、类、命名空间、编译单元)。
您还可以使用ToString()
or ToFullString()
(带有正确的缩进和换行符以及所有内容)获得语法节点的格式良好的表示,这正是您最初寻找的。
网上有很多关于如何使用这个 API 的教程(比如1、2),还有Roslyn Quoter网站可以将一段 C# 代码转换为SyntaxFactory
调用。
其次,您可以使用生成的结果CSharpSyntaxNode
创建一个CSharpSyntaxTree
,您可以借助以下工具将其编译成 IL CSharpCompilation
(毕竟,Roslyn 是参考 C# 编译器)。
如果需要,您甚至可以将生成的程序集发送到流中,从那里获取程序集的二进制数据,并将新创建的程序集加载到当前正在执行的程序集中,并动态实例化您刚刚定义的类型。
您需要使用 .NET 反射。
Ildasm.exe 无法帮助您,因为它不会创建您需要的 .cs 文件。
因此,要么是来自 SharpDevelop 团队或来自 JetbrainsILSpy
的开源 .NET 程序集浏览器和反编译器。dotPeek
根据平台,您还可以检查Mono Cecil
. Cecil 是由 Jb Evain 编写的库,用于生成和检查 ECMA CIL 格式的程序和库。
如果您需要速度JustDecompile
,Telerik 是一款免费的 .NET 程序集浏览和反编译工具,声称比竞争对手快 10 倍。
所有这些工具都可以让您获取现有的已编译程序集(.dll 或 .exe)并轻松浏览其中包含的符号,然后同样轻松地将汇编语言反编译回可读的 C# 和 IL。