Динамическая загрузка и выгрузка DLL, созданной с использованием CSharpCodeProvider
У меня есть приложение, которое использует несколько сценариев кода для генерации DLL во время выполнения и вызывает их по мере необходимости и столкнулся с некоторыми вопросами, прежде чем я продолжу и кодировать его!
Можно ли выгрузить их из памяти, когда они не нужны? Если нет - как это повлияет на производительность при загрузке их в отдельные домены приложений и вызове вызовов с использованием некоторого ipc и т. Д. - кстати, это должно быть очень быстродействующим / в режиме реального времени
В качестве альтернативы, как насчет загрузки нескольких экземпляров сгенерированной сборки (конечно, с разными версиями #)? Я предполагаю, что если вы освободите все ссылки, которые не используются, они могут быть выгружены gc/framework?
Также вопрос - будут ли какие-либо "столкновения" (не уверен, что это правильное слово?) В этом сценарии?
1 ответ
Сборки могут быть выгружены только со всем AppDomain. В зависимости от того, сколько динамических сборок вам нужно загрузить, может потребоваться загрузить их в стандартный домен приложений и оставить их в памяти до тех пор, пока приложение не будет закрыто. Однако, если вы считаете, что их будет слишком много и потребление памяти станет проблемой, вам нужно будет загрузить их в отдельный домен приложений, использовать AppDomain.DoCallBack для маршалинга вызовов через границы AppDomain и периодической выгрузки AppDomain. Например, узел T4 в Visual Studio загружает скомпилированные сборки в отдельном домене приложений для максимум 25 сеансов генерации кода, а затем выгружает домен приложений для перезапуска памяти.
Влияние дополнительной сортировки, которая должна выполняться с отдельным доменом приложений, на производительность будет незначительным по сравнению с влиянием компиляции и генерации сборки на лету. Это станет проблемой только в том случае, если количество междоменных вызовов велико. Вам, вероятно, нужно будет протестировать производительность AppDomain.DoCallBack, чтобы определить, будет ли производительность приемлемой для вашего сценария.