Как зарегистрировать несколько версий сборок, которые ссылаются на разные .Net рамки? - PullRequest
3 голосов
/ 15 сентября 2011

У меня очень странная проблема с регистрацией сборки .Net 4.0, классы из которой затем создаются и используются в приложении Delphi.Я постараюсь объяснить как можно лучше.

Немного предыстории: - В предыдущих версиях нашего продукта мы работали с .Net 3.5.- Для нашей версии сборки было установлено значение «1.0. . ».

Наши клиенты могут, а иногда и делают, иметь две версии нашего продукта, установленные одновременно.Из-за этого мы перерегистрируем наши сборки, когда клиент переключает версии.Для простоты, скажем, у них есть две версии нашей сборки в реестре.Реестр для одного зарегистрированного класса в сборке выглядит следующим образом:

CLSID {Класс GUID зарегистрирован как.} InprocServer32 1.0.3979.26322 1.0.3980.20802

В любой момент времени ключи вInprocServer32 выглядит следующим образом:

  • (по умолчанию) - mscoree.dll
  • Assembly - NameOfAssembly, Version = CurrentRegisteredVersion, Culture = нейтральный, PublicKeyToken = null
  • Класс -NameOfAssembly.ClassName
  • RunTimeVersion - v2.0.50727
  • ThreadingModel - Оба

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

В этом случае для RunTimeVersion для одной будет установлено значение v2.0.50727, как указано выше, а для другой будетустановите v4.0.30319.

Вот где все разваливается ... после того, как сборка зарегистрирована на платформе 4.0, только одна версия нашего продукта будет работать правильно, и это версия, построенная на любой сборке.имеет больший номер версии сборки.

Я знаю, что, возможно, мне не совсем понятна эта последняя часть, поэтому позвольте мне упростить еще.Скажем, у нас есть две версии, построенные для следующих сред выполнения:

  • Версия сборки 1, время выполнения 3.5
  • Версия сборки 2, время выполнения 3.5

..В этом случае я могу зарегистрировать любую версию, и текущая зарегистрированная версия будет работать правильно.

Но если у меня есть следующее:

  • Сборка Версия 1, Время выполнения 3.5
  • Версия сборки 2, время выполнения 4.0

или

  • Версия сборки 1, время выполнения 4.0
  • Версия сборки 2, время выполнения 3.5

... тогда, если я зарегистрируюсь и запускаю версию 1, я получу OLE-ошибки в приложении Delphi, пытающемся создать экземпляр класса.

Если я зарегистрируюсь и запускаю версию 2все работает нормально.
Если я регистрирую версию 1 и вручную удаляю ключ версии 2, версия 1 будет работать нормально.
Если я регистрирую версию 1 и вручную изменяю RunTimeVersion версии 2, чтобы она соответствовала версии 1,Версия 1 будет работать нормально.

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

...