我正在尝试连接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的依赖)幅: (http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/ - 我找不到NHibernate.Caches.EnyimMemcached的nuget包)
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更近。 (感谢你指出马克!)
有什么想法?有一个我不知道的NHibernate.Caches.EnyimMemcached nuget包吗?还是使用2.3而不是2.12的protobuf-net.Enyim?我无法想象我是唯一一个试图使用这个NHibernate-Enyim-Protobuf-net堆栈的人。我很惊讶装配绑定重定向没有解决问题。
更新:我很乐意遵循Marc的建议。我只是下载了NHibernate.Caches.EnyimMemcached的源代码,并将其Enyim.Caching引用从unsigned v2.3程序集更改为签名的2.12程序集。一切都很好吃!
答案 0 :(得分:3)
“只有v2.12” - 这让我在那里绊了一秒钟,但2.12比2.3更新近; 2.7是2011年1月; 2.12是2012年10月。我似乎根本无法获得2.3(甚至通过命令行工具)。没有“只有... v2.12”之类的东西,因为在撰写本文时,v2.12 是最新的版本。
我可以建议的最简单的方法是尝试手动构建protobuf代码转换器,直接引用NHibernate使用的任何版本。
围绕enyim工具似乎有一些...... 奇怪;野外至少有两个不同的版本(具有不同的强名称IIRC) - 它们甚至在一些地方的界面略有不同(Int16
与Int32
,Flag
vs { {1}},来自记忆)。 可能是NHibernate正在使用“其他”的。我从nuget那里开始构建;但是 - 如果这是“错误的”,我很乐意重新评估。
编辑:
我从您的链接下载了NHCH-3.2.0.GA-bin.zip,并使用Flags
检查公钥;这给了:
{path removed} \ Enyim.Caching.dll不代表强名称程序集
然后我尝试使用通过sn -T <path>
从nuget新下载的版本,这样做了:
公钥令牌是cec98615db04012e
所以基本上,在2.3和2.12之间的某个时刻,它已经开始使用强名称。
这意味着这些dll将始终具有根本不同的身份,永远不可互换。遗憾的是,我对此无能为力。如果你无法更新NH,那么你将不得不针对非强名称的dll进行protobuf工具的本地构建。如果您在构建与缺少的成员Install-Package EnyimMemcached
相关的问题时遇到问题,请尝试将代码本地更改为Flags
。
就个人而言,如果是我,添加,删除或更改公钥令牌是值得进行“主要”修订更新 - 即转到3.0;因为那基本上是一个突破性的变化。