Я внес изменения в NHibernate 2.1.2, и поэтому сражался с .NET и сильными именами сборок. Я настроил ResolveEventHandler для загрузки моей версии NHibernate, которую я подписал, которую я регистрирую перед созданием своей фабрики сессий:
Assembly ModifiedNHibernateAssemblyResolver(object sender, ResolveEventArgs args) {
var name = new AssemblyName(args.Name);
switch (name.Name) {
case "NHibernate":
return typeof(NHibernate.NHibernateUtil).Assembly;
}
return null;
}
Я получаю одиночные ссылки на «NHibernate.XmlSerializer, Version = 2.1.2.4000, Culture = нейтральный, PublicKeyToken = 3557c07e7d6e1f91» теперь, когда он подписан (а не один с этим токеном, за которым следует один с токеном = null), он не загружается при обнаружении Касла:
Could not load type NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle.
System.IO.FileLoadException: The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Когда он не был подписан, при загрузке SysCache произошел сбой, теперь он здесь, и я понятия не имею, почему. Я не вижу никаких ссылок на загрузку SysCache, поэтому я думаю, что порядок загрузки изменился, но моя проблема - сама ошибка. Единственными различиями между ними являются токены открытого ключа, версии одинаковы, у меня есть только одна сборка NHibernate, на которую я ссылаюсь в проекте путем просмотра (нет в GAC), и я застрял.
Есть ли способ загрузить сборку с другим открытым ключом? Если нет, то как мне начать вносить изменения в NHibernate, чтобы я мог по-прежнему использовать другие библиотеки, некоторые из которых я не смогу скомпилировать под моим ключом?
Редактировать: чтобы сделать этот вопрос более общим, поскольку, скорее всего, это общая проблема: как я могу загрузить сборку с токеном открытого ключа, отличным от ожидаемого в другом проекте?
Похоже, это означало бы смерть для внесения собственных изменений в проекты с открытым исходным кодом, если бы не было никакого способа, так как тогда вы не могли бы использовать его ни с чем. Если вы подпишете его, все, что его использует, прилипнет к вашему коду Если вы этого не сделаете, то, что подписано, не может вызвать ваш код ...