3

我正在尝试连接 NHibernate 以使用 Enyim.Memcached 提供程序进行二级缓存。此外,我希望 Enyim.Memcached 使用 protobuf-net 作为其序列化程序。

查看 nuget 和 web,我可以找到几乎所有我需要的部分:

核桃:

  • 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.Cachingv2.3

然而,当我把所有东西都连接起来时,我得到了一个The located assembly's manifest definition does not match the assembly reference.错误。问题似乎是:

  • NHibernate.Caches.EnyimMemcached想要Enyim.Cachingv2.3
  • protobuf-net.Enyim想要Enyim.Cachingv2.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。哦!2.122.3 更新。(感谢您指出马克!)

有什么想法吗?是否有我不知道的 NHibernate.Caches.EnyimMemcached nuget 包?还是使用 2.3 而不是 2.12 的 protobuf-net.Enyim?我无法想象我是唯一一个尝试使用这个 NHibernate-Enyim-Protobuf-net 堆栈的人。我很惊讶程序集绑定重定向没有解决这个问题。

更新:我很乐意听从 Marc 的建议。我只是下载了 NHibernate.Caches.EnyimMemcached 的源代码并将其 Enyim.Caching 引用从未签名的 v2.3 程序集更改为已签名的 2.12 程序集。一切都是肉汁!

4

1 回答 1

3

“只有 v2.12”——这让我一时不知所措,但 2.12 比 2.3 更新得多;2.7 是 2011 年 1 月;2.12 是 2012 年 10 月。我似乎根本无法获得 2.3(即使通过命令行工具)。没有“仅... v2.12”之类的东西,因为在撰写本文时,v2.12是最新版本

不过,我可以建议的最简单的事情是尝试手动构建 protobuf 转码器,直接引用 NHibernate 使用的任何版本。

enyim 工具周围似乎有一些……奇怪的地方;在野外至少有 2 个不同的版本(具有不同的强名称 IIRC)-它们甚至具有稍微不同的界面(Int16vsInt32在一些地方,和Flagvs Flags,来自内存)。可能是NHibernate 正在使用“其他”的。我选择了 nuget 的构建;但是 - 如果这是“错误的”,我很乐意重新评估。

编辑:

我从您的链接中下载了 NHCH-3.2.0.GA-bin.zip,并用于sn -T <path>检查公钥;这给出了:

{路径已删除}\Enyim.Caching.dll 不代表强命名程序集

然后我用从 nuget via 新下载的版本尝试了这个Install-Package EnyimMemcached,它给出了:

公钥令牌是 cec98615db04012e

所以基本上,在 2.3 和 2.12 之间的某个时间点,它已经开始使用强名称。

这意味着这些 dll 将始终具有根本不同的身份,并且永远不能互换。可悲的是,我对此无能为力。如果您无法更新 NH,那么您将不得不针对非强命名 dll 执行 protobuf 工具的本地构建。如果您在构建它时遇到与缺少成员相关的问题Flags,请尝试将代码本地更改为Flag.

就我个人而言,如果是我,添加、删除或更改公钥令牌是值得进行“重大”修订更新的——即升级到 3.0;因为这从根本上是一个突破性的变化。

于 2013-02-17T20:28:23.717 回答