【问题标题】:Extract class from assembly in C#从 C# 程序集中提取类
【发布时间】:2018-01-22 20:17:08
【问题描述】:

是否可以从使用 Reflection.Emit 创建的程序集中提取类并将其物理保存到目录中?

我想使用这种操作来动态生成具有特定内容(类、方法...)的项目。

有没有办法用代码保存动态类而不需要外部工具来反编译它们?

【问题讨论】:

    标签: c# reflection reflection.emit


    【解决方案1】:

    可以,只要您在拨打AssemblyBuilder.DefineDynamicAssembly 时传入AssemblyBuilderAccess.RunAndSaveAssemblyBuilderAccess.Save。然后您可以使用Save method 将其写入磁盘 - 对于通过Peverify 运行它以查看您做错了什么非常有用:)

    请注意,这会保存 IL - 而不是 C# 源代码,因此您仍然需要对它们进行反编译。如果您想要 C# 源代码而不进行反编译,那么您需要生成 C# 源代码作为您的源代码 - 大概通过 Roslyn 或 CSharpCodeProvider 传递它以获取 IL。

    注意:以这种方式使用时,并非所有操作都有效 - 例如,如果您要跳过可访问性检查,以访问您无法控制的类型的非公共成员。这在某些仅运行时的方案中是允许的,但在从磁盘加载的程序集中不可靠。同样,在 IL 中,很多事情都可能没有直接的 C# 等效项。

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2012-07-20
      相关资源
      最近更新 更多