Поймать загрузку DLL - PullRequest
       19

Поймать загрузку DLL

2 голосов
/ 21 декабря 2010

Я пытаюсь создать клиентский программный пакет .NET, который загружает его компоненты по требованию.

Допустим, у меня есть программа, которая разбита на основной исполняемый файл и 20 других DLL-файлов. Основная программа ссылается на 3 из них, в любом случае они ссылаются на некоторые другие ... у них есть какая-то древовидная структура зависимости.

Я пытаюсь добиться того, чтобы распространять только основной исполняемый файл и получать все остальное из расположения сервера по требованию.

Примерно так: Основная программа и все эти проекты DLL находятся в одном решении и строятся вместе, как и любое другое решение. При распространении распространяется только exe-файл, остальные dll (включая некоторые используемые сторонние библиотеки) помещаются в расположение сервера, доступное для загрузки.

exe запускается, показывает некоторый пользовательский интерфейс, когда пользователь щелкает по пункту меню, должно быть показано другое окно пользовательского интерфейса из одного файла dll, так что операционная система ищет dll (которого там нет), я вмешиваюсь, скачиваю Требуется dll с сервера, поместите его рядом с исполняемым файлом и позвольте ОС загрузить его, как если бы он был там с самого начала.

Это выглядит достижимым благодаря использованию общего класса Interface и некоторой магии отражения, но я надеялся на что-то большее, то, что включает в себя создание библиотеки dll в одном решении, то, что включает в себя загрузку сторонних библиотек по требованию .

Есть идеи, как это сделать?

Ответы [ 3 ]

1 голос
/ 21 декабря 2010

Предоставьте обработчики событий для событий AppDomain.ResolveAssembly и AppDomain.ResolveType для текущего домена приложения и загрузите сборки.

Но будьте осторожны при загрузке сборок в нужном контексте: http://msdn.microsoft.com/en-us/library/dd153782.aspx

1 голос
/ 21 декабря 2010

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

Вы должны прочитать эту статью.

1 голос
/ 21 декабря 2010

Вы ищете событие AppDomain.AssemblyResolve , которое позволяет загружать сборки из пользовательских мест.
Вам не понадобятся другие отражения.

...