Динамическая загрузка сборок AssemblyResolve выдает - PullRequest
0 голосов
/ 24 мая 2010

Примечание. Это продолжение моего предыдущего поста: Сложная проблема 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 из этой сборки".Тип, который не может быть загружен, относится к одной из указанных сборок, а не к основной.

Почему это происходит?

Есть предложения?

Спасибо

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Немного поздно, но вы также можете проверить PublicKeyToken сборки. Я полагаю, что для .net существует три токена. Вы можете найти их, посмотрев в папку Windows Framework. Таким образом, вы можете включить сборки в другие папки, если вам нужно.

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

1 голос
/ 24 мая 2010

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

...