Сложная проблема API с динамическим вызовом сборок - PullRequest
2 голосов
/ 29 апреля 2010

У меня есть интересный вызов, который мне интересен, может ли кто-нибудь здесь дать мне какое-то указание.

Я пишу приложение .Net windows form, которое работает в сети и использует SQL Server для сохранения и извлечения данных.

Я хочу предложить мини-плагин API, где разработчики могут создавать свои собственные сборки и реализовывать определенный интерфейс (IDataManipulate). Эти сборки могут затем использоваться моим приложением для вызова функций интерфейса и выполнения каких-либо действий.

Я могу создавать сборки с помощью моего API, копировать файл в папку на локальном жестком диске и настраивать приложение для использования Reflection для вызова определенной функции из реализованного интерфейса (IDataManipulate.Execute).


Проблема:

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

Решения, которые я пробовал:

Решение 1
Скопируйте dll API в общий сетевой ресурс.

Проблема:
Требуется AllowPartiallyTrustedCallersAttribute, для которого требуется пение .Net, которое я не могу заставить от своих пользователей.

Решение 2 (предпочтительно)
Сериализация объекта dll, сохранение его в базе данных, десериализация и вызов IDataManipulate.Execute.

Проблема:
После десериализации я пытаюсь привести его к объекту IDataManipulate, но возвращает ошибку при поиске самого файла DLL.

Раствор 3
Сохраняйте байты dll как byte [] в базу данных и воссоздайте dll на локальном ПК каждый раз, когда пользователь запускает мое приложение.

Проблема:
У Dll могут быть зависимости, которые я не знаю, смогу ли я обнаружить.


Любые предложения будут с благодарностью.

Спасибо

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

Я уже делал «Решение 3» раньше.Мы сохранили файлы DLL в таблице базы данных с отметкой времени «последнего изменения».Таким образом, вы можете определить, нужно ли обновлять локальный файл при запуске приложения.

Вы можете вызвать Assembly.GetReferencedAssemblies , чтобы получить список зависимостей из сборки.Предполагается, что подключаемый модуль DLL не использует отражение для динамической загрузки случайной сборки, но это должно быть приемлемым.

Другой вариант - использовать событие AppDomain.AssemblyResolve .Вместо загрузки всех библиотек DLL плагинов при запуске это событие позволит вам загружать только те библиотеки DLL, которые действительно необходимы.

0 голосов
/ 29 апреля 2010

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

...