Использование внешних сборок: определение манифеста обнаруженной сборки не соответствует ссылке на сборку - PullRequest
3 голосов
/ 30 июня 2011

Я знаю, что на этот вопрос, кажется, ответили во всем стеке и потоке, но моя проблема в другом.

Я пытаюсь понять, как не использовать GAC (босс говорит «нет»), когда у меня естьследующая настройка:

В проекте используются NHibernate и Antlr3.Stringtemplate. Обе они являются сторонними сборками.NHibernate имеет ссылку на Antlr3.Runtime-версию 3.1.3.42154. Antlr3.Stringtemplate содержит ссылку на Antlr3.Runtime-версию 3.3.1.7705

Одна ошибка, если другая недоступна.

Я пыталсяПереадресация привязки, но это не работает, потому что publicKeyToken отличается между версиями.В итоге он ищет 3.3.17705 с токеном открытого ключа, который соответствует версии 3.1.3.42154.

Установка одного или обоих в работах GAC.Однако мой начальник не разрешил мне устанавливать что-либо в GAC.

Я также попытался поместить обе библиотеки DLL в каталог BIN, включив проект Lib с папкой для версии 3.1.3.42154.Я сказал ему всегда копировать, и поэтому я получаю /bin/Lib/3.1.3.42154/Antlr.Runtime.dll Затем я добавил элемент зондирования, чтобы проверить этот каталог.Это не сработало, и я получил точно такую ​​же ошибку.

Как можно использовать сторонние сборки, ссылающиеся на другую стороннюю сборку, обе обе ссылаются на разные версии?

ОБНОВЛЕНИЕ:

    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime.dll"); // 3.3.1        
    System.Reflection.Assembly.LoadFile(@"Antlr3.Runtime\Antlr3.Runtime.dll"); // 3.1.3

AppDomain.CurrentDomain.GetAssemblies () показывает, что версии загружены в домен приложения, однако все равно появляются ошибки, указывающие, что не удается найти thta 3.1.3.

Ниже показано, что загружается изAppDomain.CurrentDomain.GetAssemblies () прямо перед вызовом кода с ошибками.Первые 2 строки - это то, что в GetAssemblies (), третья строка - это то, что, как говорит ошибка, отсутствует.

{Antlr3.Runtime, Version=3.3.1.7705, Culture=neutral, PublicKeyToken=eb42632606e9261f}
{Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7}
 Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7

1 Ответ

1 голос
/ 07 июля 2011

Решил проблему.

Это специфическая проблема с использованием Antlr3.StringTemplate. Парень, создавший stringtemplate, фактически загрузил исходный код antlr и собрал его с помощью своего приложения вместо того, чтобы распространять исходную antlr dll.Его новый antlr dll имеет то же имя, но другую подпись.Он меняет версию и токен открытого ключа.Так что это вызывает очень плохие конфликты, если вы пытаетесь использовать оригинал с такими вещами, как NHibernate.

Таким образом, решение было использовать ILMerge для слияния его пользовательской библиотеки Antlr3 в библиотеку string.template.сделать string.template dll зависимым только от самого себя.Я объединил Antlr3.Runtime.dll, Antlr3.StringTemplate.dll и Antlr3.Runtime.Debug.dll в одну DLL Antlr3.StringTemplate.dll

Это позволило удалить все конфликты DLL, и я смог включитьAntlr3.Runtime.dll, что нужно nhibernate.Парень, который производит stringtemplate, должен просто так распространять свою посылку.

...