Создание класса, реализующего интерфейс динамически
Я пытаюсь написать код, который позволяет пользователю загрузить сборку (файл 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 для этого, хотя я не уверен, что его можно автоматизировать так, как вы хотите.