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

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

有没有一种方法可以用代码保存动态类,而无需外部工具对其进行反编译?

最佳答案

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

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

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

关于c# - 从C#中的程序集提取类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48380934/

10-10 23:24