Динамическая загрузка и выгрузка dll, созданного с помощью CSharpCodeProvider - PullRequest
4 голосов
/ 22 июля 2009

У меня есть приложение, которое использует некоторые кодовые скрипты для генерации dll-файлов во время выполнения и их вызова по мере необходимости, а также столкнулся с некоторыми вопросами, прежде чем я начну его кодировать!

Можно ли выгружать их из памяти, когда они не нужны? Если нет - как это повлияет на производительность при загрузке их в отдельные домены приложений и вызове вызовов с использованием некоторого ipc и т. Д. - кстати, это должно быть очень быстродействующим / в режиме реального времени

В качестве альтернативы, как насчет загрузки нескольких экземпляров сгенерированной сборки (конечно, с разными версиями #)? Я предполагаю, что если вы отпустите все ссылки, которые не используются, они могут быть выгружены gc / framework?

Также вопрос Q: будут ли в этом сценарии какие-либо "столкновения" (не уверен, что это правильное слово?)?

1 Ответ

7 голосов
/ 22 июля 2009

Сборки могут быть выгружены только со всем AppDomain. В зависимости от того, сколько динамических сборок вам нужно загрузить, может потребоваться загрузить их в стандартный домен приложений и оставить их в памяти до тех пор, пока приложение не будет закрыто. Однако, если вы считаете, что их будет слишком много и потребление памяти станет проблемой, вам нужно будет загрузить их в отдельный домен приложений, использовать AppDomain.DoCallBack для маршалинга вызовов через границы AppDomain и периодической выгрузки AppDomain. Например, хост T4 в Visual Studio загружает скомпилированные сборки в отдельный домен приложений для максимум 25 сеансов генерации кода, а затем выгружает домен приложений для перезапуска памяти.

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

...