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.3protobuf-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; так как это принципиально серьезное изменение.