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