NHibernate.Caches.EnyimMemcached, protobuf-net.Enyim хотят конфликтующие версии Enyim.Caching

Я пытаюсь подключить NHibernate для использования провайдера Enyim.Memcached для его кэширования второго уровня. Кроме того, я хочу, чтобы Enyim.Memcached использовал protobuf-net в качестве своего сериализатора.

Глядя на nuget и Интернет, я могу найти практически все, что мне нужно:

NuGet:

  • protobuf-net.Enyim
  • protobuf-net (зависимость от protobuf-net.Enyim)
  • EnyimMemcached (Enyim.Caching) v2.12 (зависимость от protobuf-net.Enyim)

web: ( http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/ - я не смог найти пакет nuget для NHibernate.Caches.EnyimMemcached)

  • NHibernate.Caches.EnyimMemcached
  • Enyim.Caching v2.3

Однако, когда я подключаю все, я получаю The located assembly's manifest definition does not match the assembly reference. ошибка. Проблема выглядит так:

  • NHibernate.Caches.EnyimMemcached хочет Enyim.Caching v2.3
  • protobuf-net.Enyim хочет Enyim.Caching v2.12

Они не играют хорошо. Я попытался добавить перенаправление сборки, но безрезультатно:

  <dependentAssembly>
    <assemblyIdentity name="Enyim.Caching" publicKeyToken="cec98615db04012e" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.3.0.0" newVersion="2.3.0.0" />
  </dependentAssembly>

"Последняя" сборка Enyim.Caching (через пакет EnyimMemcached) имеет только v2.12. D'о! 2.12 более поздняя, ​​чем 2.3. (Спасибо за указание на это Марк!)

Какие-нибудь мысли? Есть ли какой-нибудь пакет Nuget NHibernate.Caches.EnyimMemcached, о котором я не знаю? Или protobuf-net.Enyim, который использует 2.3 вместо 2.12? Я не могу себе представить, что я единственный, кто пытался использовать этот стек NHibernate-Enyim-Protobuf-net. И я удивлен, что редирект привязки сборки не устранил проблему.

ОБНОВЛЕНИЕ: я хорошо, чтобы последовать совету Марка. Я просто скачал исходный код NHibernate.Caches.EnyimMemcached и изменил его ссылку на Enyim.Caching с неподписанной сборки v2.3 на подписанную сборку 2.12. Все подливки!

1 ответ

Решение

"only has v2.12" - это споткнуло меня на секунду, но 2.12 намного новее, чем 2.3; 2,7 января 2011 года; 2.12 - октябрь 2012 года. Кажется, я вообще не могу получить 2.3 (даже с помощью инструментов командной строки). Нет такой вещи, как "only ... v2.12", потому что на момент написания v2.12 является самой последней версией.

Однако самое простое, что я могу предложить, - это попытаться собрать транскодер protobuf вручную, напрямую ссылаясь на версию, с которой работает NHibernate.

Кажется, есть некоторая... странность, окружающая инструмент enyim; в дикой природе есть как минимум 2 разные версии (с разными строгими именами IIRC) - и они даже имеют немного разные интерфейсы (Int16 против Int32 в нескольких местах и Flag против Flags, из памяти). Возможно, NHibernate использует "другой". Я пошел со сборкой из Nuget; но - если это "неправильный", я с радостью переоцениваю это.

Редактировать:

Я скачал NHCH-3.2.0.GA-bin.zip по вашей ссылке и использовал sn -T <path> проверить открытый ключ; это дает:

{путь удален}\Enyim.Caching.dll не представляет сборку со строгим именем

Затем я попробовал это с версией, недавно загруженной из Nuget через Install-Package EnyimMemcached, который дает:

Токен открытого ключа - cec98615db04012e

Таким образом, в основном, между 2.3 и 2.12, он начал использовать строгое имя.

Это означает, что эти библиотеки всегда будут принципиально отличаться друг от друга и никогда не будут взаимозаменяемыми. Я ничего не могу с этим поделать, к сожалению. Если вы не можете обновить NH, то вам придется выполнить локальную сборку инструмента protobuf против dll без строгого имени. Если у вас возникли проблемы со сборкой, связанной с пропавшим участником Flags попробуйте изменить код локально на Flag,

Лично, если бы это был я, добавление, удаление или изменение токена открытого ключа заслуживает "серьезного" обновления ревизии - то есть перехода на 3.0; так как это принципиально серьезное изменение.

Другие вопросы по тегам