Создание класса, реализующего интерфейс динамически

Я пытаюсь написать код, который позволяет пользователю загрузить сборку (файл DLL), выбрать интерфейс в указанной сборке, а затем сгенерировать класс, наследующий этот интерфейс, с заглушками для всех необходимых методов.

Класс будет сгенерирован либо в файле, либо в активном сеансе VS (код предназначен для использования внутри IWizard, инициализированного во время создания проекта через пользовательский шаблон).

Я дошел до того, что у меня есть объект Type интерфейса, но мне трудно разобраться в следующей части, я подумал о том, чтобы перебрать методы интерфейса в цикле и скопировать их в текстовый файл, добавив реализации заглушки в соответствующих местах, но я уверен, что есть какой-то лучший способ, возможно, с помощью стороннего инструмента?

Любая помощь будет оценена, спасибо заранее.

1 ответ

Решение

Если вы хотите создать новый тип во время выполнения, вам нужно использовать Reflection.Emit. Reflection.Emit позволяет передавать промежуточный язык непосредственно в текущий домен приложений (или сборку, если вы предпочитаете). Возможно, вы захотите использовать тип в памяти, поэтому вы можете не захотеть создавать фактическую сборку.

Создание нового типа выполняется с помощью TypeBuilder учебный класс.

Codeproject имеет отличное введение: http://www.codeproject.com/KB/dotnet/Creating_Dynamic_Types.aspx

ОБНОВИТЬ:

До моего сведения дошло, что цель состоит в том, чтобы добавить файл кода C# в существующий проект. Вам все еще нужно будет отразить сборку и создать IL, но тогда вам придется "разбирать" IL на C#. Reflector - рекомендуемый инструмент №1 для этого, хотя я не уверен, что его можно автоматизировать так, как вы хотите.

Другие вопросы по тегам