Не удалось загрузить сборку в новый домен приложения

У меня есть приложение mvc3. У меня есть подпапка в моем проекте приложения под названием «Плагины».

Все dll, хранящиеся в этой папке, должны обновляться во время выполнения, поэтому затем мы помещаем домен приложения и перезагружаем новую версию dll, поэтому я пытаюсь загрузить все dll плагина в другой домен приложения и установить его свойства shadowCopy .

Просматривая SO, msdn и некоторые блоги, я нашел это «решение». (это вызывается во время моего Application_Start)

static AppDomain pluginDomain;
static PluginHolder()
        {
            AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;
            domainSetup.ApplicationName = "Plugins";
            domainSetup.PrivateBinPathProbe = domainSetup.PrivateBinPath;
            domainSetup.PrivateBinPath = GetPluginsDirectory();
            domainSetup.ShadowCopyFiles = "true";
            domainSetup.ShadowCopyDirectories = domainSetup.PrivateBinPath;

            pluginDomain= AppDomain.CreateDomain("Plugins", null, domainSetup);
            var item = pluginDomain.Load(File.ReadAllBytes(GetPluginsDirectory() + "Item.dll"));
        }

«Item.dll» — это dll, которую я пытаюсь загрузить. Последняя строка выдает «Не удалось загрузить файл или элемент сборки или одну из его зависимостей». Кажется, это то, как другие люди преуспели, но это просто не сработает для меня.

У меня нет предыдущего опыта работы с AppDomains, поэтому я не знаю, как подойти к этой проблеме и правильно ли я ее решаю.

Подходит ли загрузка моей сборки через новый AppDomain?


person Xavier Guzman    schedule 18.09.2012    source источник


Ответы (1)


Чтобы расшифровать такие сообщения об ошибках, следует использовать Просмотр журнала привязки сборки.

Также обратите внимание на раздел примечаний на странице документации AppDomain.Load(byte[] ). Если вы хотите загрузить сборку в новый AppDomain, вам следует использовать CreateInstanceAndUnwrap вместо этого.

Если вы хотите внедрить механизм подключаемого модуля в .NET, вам необходимо понять домены приложений, разрешение и загрузку сборок, а затем выбрать механизм связи между объектами из разных доменов приложений. Большинство хороших книг по .NET и CLR содержат главу или две о AppDomains, и они помогут вам освоиться. Теперь, что касается взаимодействия между доменами приложений, вы можете использовать WCF или .NET Remoting (MarshalByRefObject).

Удачи.

person Panos Rontogiannis    schedule 26.09.2012