Создать динамическую копию существующей сборки/модуля

Можно ли создать динамическую копию сборки или модуля/класса? Я смог легко найти, как создать динамическую сборку или модуль с нуля, используя AssemblyBuilder/ModuleBuilder (как показано здесь), но есть ли способ создать копию существующей сборки или типа в качестве соответствующего типа Builder?

Изменить 1

Например, предположим, что у вас есть стандартное консольное приложение с обязательным классом Program и методом Main, и вы добавляете в проект еще один класс с именем «A». Моя цель — создать динамическую копию класса A в методе Main, используя ModuleBuilder или что-то подобное.

Редактировать 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. Мне также не нужно сохранять сборку.


person Thick_propheT    schedule 03.05.2013    source источник
comment
Вы имеете в виду, что вы будете генерировать код из класса A и генерировать сборку?   -  person Toan Vo    schedule 03.05.2013
comment
Мне действительно нужен только сгенерированный код из класса A, но если для этого требуется генерация сборки, то это не имеет значения.   -  person Thick_propheT    schedule 03.05.2013


Ответы (1)


Судя по вашим комментариям выше, вы хотите сгенерировать код C# и также можете его скомпилировать. Если это так, я предлагаю вам взглянуть на CodeDom вместо использования AssemblyBuilder и ModuleBuilder. Это будет прямолинейно и легко понять.

Ссылки ниже помогут вам:

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

http://www.codeproject.com/Articles/7119/Компиляция-с-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/

person Toan Vo    schedule 03.05.2013
comment
Я добавил еще несколько пояснений выше. - person Thick_propheT; 03.05.2013
comment
Насколько я могу судить, ни одна из этих ссылок не описывает, как это сделать с существующей сборкой. - person Peter Moore; 17.02.2021