动态创建 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
.
包
首先,可以使用SyntaxFactory
class生成语法节点,可以组合成更大的结构(成员、方法、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。
我正在使用 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
.
首先,可以使用SyntaxFactory
class生成语法节点,可以组合成更大的结构(成员、方法、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。