Примечание. Это продолжение моего предыдущего поста: Сложная проблема API с динамическим вызовом сборок
Я пишу приложение .Net windows forms, которое работает насеть и использует SQL Server для сохранения и извлечения данных.
Я хочу предложить мини-плагин API, где разработчики могут создавать свои собственные сборки и реализовывать определенный интерфейс (IDataManipulate).Эти сборки могут быть использованы моим приложением для вызова IDataManipulate.Execute ().
Я решил пойти с решением № 3:
Сохранять dll-байты как байт [] в базу данных и заново создавать dll на локальном ПК каждый раз, когда пользователь запускаетмое заявление.
Вот что я делаю:
- Мое приложение предлагает пользователю загрузить сборку .Net, которая реализует интерфейс моего API (IDataManipulate) ("main").сборка) и сохраняйте байты в базе данных.
- Затем, используя Assembly.GetReferencedAssemblies, я получаю список ссылочных сборок и сохраняю их байты в базе данных («ссылочные» сборки), предполагая, что пользователь предоставил фактические файлы.в той же папке.
Вопрос: Как узнать системные сборки из списка Assembly.GetReferencedAssemblies и исключить их? - При запуске приложения я получаю байты для основной сборки из базы данных,создайте сборку с помощью Assembly.Load (byte []) и используйте CreateInstance (тип), где тип - это объект, который реализует IDataManipulate (поэтому я могу вызвать IDataManipulate.Execute ()).
- Затем я использую домен приложения.Событие AssemblyResolve для загрузки байтов ссылочных сборок из базы данных с использованием Aseembly.Load (byte [])
Все работает;DLL-файлы загружены, и я могу вызвать IDataManipulate.Execute () за исключением этой проблемы:
Проблема
Когда я вызываю IDataManipulate.Execute () из основной сборки, я получаю такую ошибку, какMsgstr "Я не могу загрузить тип xxxx из этой сборки".Тип, который не может быть загружен, относится к одной из указанных сборок, а не к основной.
Почему это происходит?
Есть предложения?
Спасибо