2013-03-08 5 views
2

У меня есть текущая сборка в моем приложении, и я хотел бы добавить класс из внешнего файла cs в эту сборку. Можно ли это сделать? Я хотел бы использовать его как плагины. Теперь я пытаюсь использовать:Добавить класс в текущую сборку

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); 

и Activator, но безуспешно. Мое приложение использует Roslyn, так что, возможно, он может это сделать. Любая идея будет оценена по достоинству.

Редактировать: Следующая проблема с этим: Можно ли использовать внешний файл (файл cs с классом), чтобы получить экземпляр из этого файла, но конструктору класса нужна ссылка на sceneManager из текущей сборки. Так можно отправить ссылку на Roslyn на что-то подобное и получить от него экземпляр класса?

ответ

5

Вы не можете изменить существующую сборку, которая уже была загружена.

Вместо этого вы можете скомпилировать код в новую сборку (используя Roslyn, CodeDOM, Sigil или подобные библиотеки) и загрузить эту сборку с использованием отражения.

3

Файл '.cs' сам по себе является только текст. Вы не можете сделать что-нибудь с ним, не скомпилировав его через какой-то маршрут. Но нет: вы не можете добавлять дополнительные классы в сборку во время выполнения. Вы можете скомпилировать код во время выполнения через CSharpCodeProvider или аналогичный, и загрузить сгенерированную сборку. Тем не менее, это очень много. В зависимости от контекста, такие инструменты, как Iron Python, могут быть предпочтительнее, если вам нужно делать много вещей из сценариев во время выполнения.

+0

Хорошо, я использую Roslyn для запуска сценариев, поэтому я пытаюсь загрузить с ним новую сборку. – wolen

+0

Когда я думаю об этом, я нашел небольшую проблему. Мне нужно создать экземпляр класса из файла (из моей сборки), но конструктору нужна ссылка на sceneManager из текущей сборки. Можно ли это сделать? – wolen

+0

@wolen возможно? конечно; тривиальный? нет; каким-то образом вам нужно передать этот экземпляр, который может включать ссылки на сборку, или может включать передачу его как «object» –