c# - 创建现有程序集/模块的动态副本

标签 c# reflection dynamic-assemblies

是否可以创建程序集或模块/类的动态副本?我能够轻松地找到如何使用 AssemblyBuilder/ModuleBuilder 从头开始​​创建动态程序集或模块(如 here 所示),但是有没有办法创建一个现有程序集或类型的副本作为其各自的构建器类型?

编辑1

例如,假设您有一个标准的控制台应用程序,其中包含必需的 Program 类和 Main 方法,您将另一个类添加到项目中,称为“A”。我的目标是使用 ModuleBuilder 或类似的方法在 Main 方法中创建 A 类的动态副本。

编辑2

我想复制 A 类的原因是因为我想要精确 A 类的副本,包括方法,字段,属性等,但动态创建。我想要的是必须使用 TypeBuilder/CodeDom 手动创建类型及其所有成员(方法、字段、属性等),因为在某些情况下,我可能不知道有关类及其内部工作原理的所有详细信息,或者类可能很大且乏味/无法使用此方法重现。

希望一些伪代码可以说明我在寻找什么:

// create AssemblyBuilder using the assembly of the A class so you end up with a
// dynamic copy of the assembly
AssemblyBuilder ab = new AssemblyBuilder(Assembly.GetAssembly(typeof(A)));

// get the Type as a TypeBuilder from the AssemblyBuilder
TypeBuilder tb = ab.GetModule("Test.exe").GetType(typeof(A).FullName);

我基本上只是想将 Assembly 装箱为 AssemblyBuilder 或将 Type 装箱为 TypeBuilder。我也不需要能够保存程序集。

最佳答案

从您上面的评论来看,您似乎想要生成代码 C# 并且也可以对其进行编译。 如果是这样,我建议您应该查看 CodeDom 而不是使用 AssemblyBuilderModuleBuilder。它将直接且易于理解。

下面的链接可以帮助您:

http://msdn.microsoft.com/en-us/library/650ax5cx.aspx

http://www.codeproject.com/Articles/7119/Compiling-with-CodeDom

http://blogs.msdn.com/b/davidebb/archive/2009/06/03/codedom-vs-t4-two-approaches-to-code-generation.aspx

顺便说一句,如果您想构建一个类似于 Reflector 的工具,它将加载外部程序集并生成回代码,那么您也应该使用 CodeDom。

引用这里:

https://www.simple-talk.com/dotnet/.net-framework/-.net-reflector-meets-the-codedom/

关于c# - 创建现有程序集/模块的动态副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16364466/

相关文章:

c# - 为什么两个空列表不相等?

java - 如何跟踪类中所有方法的调用?

reflection - 斯卡拉反射: getDeclaringTrait?

c# - 为什么 dynamic 关键字不能用于动态加载的程序集?

c# - 使用 JQuery 重新加载部分 View

c# - 文件未找到异常 : Could not load file or assembly

c# - 用户控件中的 "Type or namespace name could not be found"

reflection - 在 D 中透明地同步对象中的任意属性

c# - 如何保存存储在内存中的动态生成的程序集?

c# - 加载插件 DLL 文件, "The invoked member is not supported in a dynamic assembly."