Динамическая загрузка и выгрузка DLL, созданной с использованием CSharpCodeProvider

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

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

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

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

1 ответ

Решение

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

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

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