2012-04-12 4 views
2

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

Например, плагин A зависит от версии 1 Common и плагина B зависит от версии 2 Common.

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

При загрузке из сборки смешанного режима, которая является требованием, мы находимся в ситуации, когда первая загруженная сборка «выигрывает». Таким образом, в примере Plugin B попытается загрузить Common v1, который в нашем случае выдает исключение TypeLoadException из-за некоторых отсутствующих типов в старой версии сборки.

Как мы можем заставить среду C++/CLI выполнить проверку ссылки в плагинах?

Мы постарались:

  1. /FU опция компилятора против соответствующих версий

  2. #using против соответствующих версий

  3. Конкретная ссылка Версия в диалоге эталонным .NET с использованием сильно названные компоненты.

Ни одно из этих данных не было эффективным для получения ссылки на сборку V2.

Обновление: немного подробнее о системе, это очень чувствительно, поэтому я придерживаюсь языка A/B выше.

CommonAssembly.dll v1 и v2 (C#) сильного название

Плугина: C++/CLI скомпилирован с/CLR, CommonAssembly v1 ссылки с параметром/FU компилятором

PluginB: C++/CLI, скомпилированные с/clr, CommonAssembly v2, на который ссылается опция компилятора FU

Основное приложение: неуправляемое - загружает плагин и плагинB во время выполнения без прямых ссылок.

Неуправляемое приложение загружает модуль PluginA, который загружает CommonAssembly v1. Затем приложение пытается загрузить PluginB, для которого требуется CommonAssembly v2. CLR пытается использовать v1 вместо этого, и существует исключение TypeLoadException.

ответ

0

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

Комбинированные сборки также не очень хорошо работают с AppDomains, поскольку нативная часть является технологической.

Возможно, вам повезло с переименованием одной из версий, так как Windows отслеживает собственные DLL.

+0

Теперь общая dll - это чистая управляемая dll, поэтому каждый плагин смешанного режима загружается только один раз.Есть ли где-нибудь вы знаете, где Иван читал об этом аспекте сборок в смешанном режиме? –

+0

@Steve: Я не уверен, что у вас есть. Вам нужно указать все ваши сборки, версии, будь то C#, C++ '/ clr' или C++'/clr: pure', и что зависит от чего. –

+0

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

Смежные вопросы