12

我正在使用 AssemblyBuilder 创建一个复杂的类,我稍后会从中创建对象。然而,如何真正构建这个类存在不确定性。那么有没有办法将这个动态创建的类写入cs文件进行检查呢?

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

4

4 回答 4

5

您可以使用将托管的 .NET dll 反编译为 C# 代码

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

于 2018-09-18T03:23:59.850 回答
2

你有使用要求AssemblyBuilder吗?我问是因为AssemblyBuilder不允许您在不使用反编译器的情况下查看生成的类,并且如果您生成的类非常复杂,则反编译的代码质量不会很好。
如果您使用它,您几乎处于相同的情况,Reflection.Emit因为它会生成低级别的 IL。
如果您确实需要查看动态生成的源代码,最好的选择是CodeDom. 这是一个示例如何:使用 CodeDOM 创建一个类

于 2018-09-19T22:11:57.383 回答
0

您可以使用 Roslyn(又名“.NET 编译器平台”)用一块石头杀死两只鸟。你需要这个包Microsoft.CodeAnalysis.CSharp

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

网上有很多关于如何使用这个 API 的教程(比如12),还有Roslyn Quoter网站可以将一段 C# 代码转换为SyntaxFactory调用。

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

于 2018-09-21T22:25:07.163 回答
0

您需要使用 .NET 反射。

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

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

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

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

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

于 2018-09-22T11:01:59.830 回答