【问题标题】:Dynamically created class to cs file?动态创建的类到cs文件?
【发布时间】:2019-02-19 01:50:18
【问题描述】:

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

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

【问题讨论】:

标签: c# .net dynamic assemblybuilder


【解决方案1】:

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

  • DotPeek JetBrains(免费,来源已关闭)
  • ILSpy 开源项目(MIT 许可证源可在 github 获得)
  • Reflector Red Gates(付费工具,来源已关闭)
  • JustDecompile by Telerik(免费提供开源反编译引擎,可在 github Apache License 获得)
  • 还有一个微软的ildasm 工具。

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

【讨论】:

  • 从我读到的反编译文件可能看起来不像源代码?
  • @Banshee 它取决于工具。其中一些生成可以编译回来的正常源代码。
  • 还应该提到dnSpy,它正在使用 ILSpy 反编译器,但功能更丰富
【解决方案2】:

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

【讨论】:

  • 我过去曾成功使用过 CodeDOM。即使 using 语句的放置不理想(在类内部?/命名空间?,我不记得哪个与文件级别相反),最终产品还是很出色的。
【解决方案3】:

您可以使用 Roslyn(又名“.NET 编译器平台”)一石二鸟。你需要 Microsoft.CodeAnalysis.CSharp 包。

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

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

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

【讨论】:

    【解决方案4】:

    您需要使用 .NET 反射。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2012-07-27
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多