是否可以从使用 Reflection.Emit 创建的程序集中提取类并将其物理保存到目录中?
我想使用此操作来动态生成具有特定内容(类、方法...)的项目。
有没有一种方法可以用代码保存动态类,而不需要外部工具来反编译它们?
最佳答案
可以,只要在调用 AssemblyBuilder.DefineDynamicAssembly
时传入 AssemblyBuilderAccess.RunAndSave
或 AssemblyBuilderAccess.Save
。然后您可以使用Save
method将其写入磁盘 - 对于通过 Peverify
运行它非常有用看看你做错了什么:)
请注意,这会保存 IL - 而不是 C# 源代码,因此您仍然需要反编译它们。如果您想要不反编译的 C# 源代码,那么您需要生成 C# 源代码作为您的源代码 - 可能通过 Roslyn 或 CSharpCodeProvider
传递它来获取 IL。 p>
注意:以这种方式使用时,并非所有操作都有效 - 如果您跳过可访问性检查,例如访问您控制之外的类型的非公共(public)成员。这在某些仅运行时的场景中是允许的,但在从磁盘加载的程序集中并不可靠。同样,许多在 IL 中没有直接 C# 等效项的事情都是可能的。
关于c# - 在 C# 中从程序集中提取类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380934/