c# - 在 C# 中从程序集中提取类

标签 c# reflection reflection.emit

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

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

有没有一种方法可以用代码保存动态类,而不需要外部工具来反编译它们?

最佳答案

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

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

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

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

相关文章:

c# - 将对象序列化为 XML 以获取命名为字段值的标签列表

java - 与 Double.TYPE 和 Double.class 的比较

c# - 如何在没有属性构造函数(Reflection.Emit)的情况下将值添加到动态添加到属性的属性

.net - AssemblyBuilder 引用程序集

c# - 我将如何进行单元测试?

c# - 如何在用 C# 编写的 Selenium WebDriver(Nunit 测试用例)中按 "Enter"?

java - 用内部类注释类

asp.net - 如何显示所有 ASP.NET Web 应用程序加载/引用的程序集及其版本号?

.net - 检查 Type 是否为 TypeBuilder

c# - 独立于架构的 Entity Framework 代码优先迁移