Динамически генерировать модули в одном пространстве сборки - PullRequest
4 голосов
/ 05 марта 2009

Считайте, что у меня запущена программа, которая должна делать следующее: Следует прочитать некоторый код из текстового файла и выполнить его в собственном пространстве сборки, чтобы новый исполняемый код мог получить доступ ко всем компонентам уже запущенного кода. Как это возможно? Помогите пожалуйста.

Ответы [ 2 ]

2 голосов
/ 07 марта 2009

Под сборочным пространством вы имеете в виду AppDomain?

Возможно, вы захотите взглянуть на IronPython . Как язык сценариев он лучше подходит для динамического добавления в программу во время выполнения.

В противном случае:

У вас есть доступ к компилятору C # (и VB.NET) через Microsoft.CSharp.CSharpCodeProvider , расположенный в System.dll.

Вы можете использовать его для компиляции этого текстового файла в отдельную dll (возможно, в памяти). Убедитесь, что вы добавляете свою текущую сборку в качестве ссылки при компиляции. Тогда вы можете либо

  • загрузить сборку в текущий исполняемый домен приложений. Таким образом, он имеет доступ ко всем объектам в вашем приложении. Вы, однако, не можете выгрузить код снова. Вам придется выгрузить весь AppDomain (т.е. ваше приложение)
  • загрузить сборку в отдельный домен приложений. Вы должны будете явно предоставить доступ к некоторым вашим объектам через Remoting (или другие методы взаимодействия с процессами), но вы можете выгрузить / заменить код в случае изменения текстового файла.

В любом случае вам придется использовать отражение для вызова вашего динамически загруженного кода.

0 голосов
/ 05 марта 2009

Не знаю, как работает магия, но я бы посмотрел на MyGeneration , которая имеет открытый исходный код и позволяет вам делать то, что вы хотите. Он может читать файлы C #, VB.Net и JScript, а затем создавать / компилировать эти сценарии и предоставлять им доступ к своему набору классов и сборок.

...