2009-08-04 1 views
6

Можно создать дубликат:
Loading DLLs into a separate AppDomainC# - загрузка сборки .NET в отдельном AppDomain Так вы можете выгрузить

Что такое правильный способ загрузить сборку .NET в отдельный AppDomain так что вы можете получить доступ к его типам/классам, но все равно сможете его выгрузить (и перезагрузить).

Это тангенс этого предыдущего обсуждения: C# - Correct Way to Load Assembly, Find Class and Call Run() Method

ответ

3

В принципе, вы просто создать новую AppDomain, а затем вызвать AppDomain.CreateInstanceAndUnwrap для создания типа. Вот простой CodeProject article об этом процессе.

Есть несколько трюков, здесь. Вы никогда не можете ссылаться на Type напрямую (это загрузит тип в ваш текущий AppDomain), и все объекты должны быть получены от MarshallByRefObj. Это позволит вам использовать объект «удаленно», что означает, что он не загружается в ваш AppDomain.

+0

+1 спасибо. Насколько плох рейтинг производительности каждый раз, когда вы пересекаете AppDomains? – BuddyJoe

+1

Всё зависит от меня. Все, что проходит между приложениями, в основном сериализовано. (Это работает очень похоже на Remoting.) В общем, если все ваши типы получаются из MarshallByRefObj, они будут сериализовать «дескриптор» поперек, так что это довольно быстро. Когда вы читаете данные, данные будут сериализованы, хотя это может немного замедлить работу. Старайтесь всегда сохранять «внутреннее» во втором appdomain, и это, вероятно, не будет проблемой. –

+0

Обратите внимание, что время жизни удаленного экземпляра ограничено. В зависимости от версии .Net вместо удаленной работы следует использовать WCF. – Guillaume