【发布时间】:2018-01-22 20:17:08
【问题描述】:
是否可以从使用 Reflection.Emit 创建的程序集中提取类并将其物理保存到目录中?
我想使用这种操作来动态生成具有特定内容(类、方法...)的项目。
有没有办法用代码保存动态类而不需要外部工具来反编译它们?
【问题讨论】:
标签: c# reflection reflection.emit
是否可以从使用 Reflection.Emit 创建的程序集中提取类并将其物理保存到目录中?
我想使用这种操作来动态生成具有特定内容(类、方法...)的项目。
有没有办法用代码保存动态类而不需要外部工具来反编译它们?
【问题讨论】:
标签: c# reflection reflection.emit
可以,只要您在拨打AssemblyBuilder.DefineDynamicAssembly 时传入AssemblyBuilderAccess.RunAndSave 或AssemblyBuilderAccess.Save。然后您可以使用Save method 将其写入磁盘 - 对于通过Peverify 运行它以查看您做错了什么非常有用:)
请注意,这会保存 IL - 而不是 C# 源代码,因此您仍然需要对它们进行反编译。如果您想要 C# 源代码而不进行反编译,那么您需要生成 C# 源代码作为您的源代码 - 大概通过 Roslyn 或 CSharpCodeProvider 传递它以获取 IL。
注意:以这种方式使用时,并非所有操作都有效 - 例如,如果您要跳过可访问性检查,以访问您无法控制的类型的非公共成员。这在某些仅运行时的方案中是允许的,但在从磁盘加载的程序集中不可靠。同样,在 IL 中,很多事情都可能没有直接的 C# 等效项。
【讨论】: