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

本文关键字:动态 副本 模块 程序集 创建 | 更新日期: 2023-09-27 18:12:06

是否可以创建程序集或模块/类的动态副本?我能够很容易地找到如何使用AssemblyBuilder/ModuleBuilder从零开始创建动态程序集或模块(如这里所示),但是有一种方法可以创建现有程序集或类型的副本作为其各自的生成器类型吗?

编辑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作为AssemblyBuilderType作为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/