Используйте .net DLL со сломанными ссылками
Мне нужно использовать DLL как API в моем приложении (С#,.NET 4.5). Я могу ссылаться на нормальную DLL. Никакой ошибки вообще. Но если я хочу использовать любой класс этой DLL, я получаю следующую ошибку компиляции:
Ошибка CS1705 Assembly 'Assembly_X' с идентификатором 'Assembly_X, Версия = 12.3.0.0, Культура = нейтральная, PublicKeyToken = c878e80841e75d00 ' использует 'Assembly_YY, Version = 65535.65535.65535.65535, Culture = neutral, PublicKeyToken = c878e80841e75d00 ', который имеет более высокую версию, чем ссылочная сборка "Assembly_YY" с личностью "Assembly_YY", Версия = 12.3.0.0, Культура = нейтральная, PublicKeyToken = c878e80841e75d00 '
Затем я проверил DLL (Assembly_X) в ILSpy. Assembly_X имеет две ссылки на Assembly_YY: один с версией 12.3.0.0 и один с версией 65535.65535.65535.65535.
Я попробовал "bindingRedirect" в App.config. Но поскольку ошибка возникает во время компиляции, это не помогает.
У меня нет исходного кода Assembly_X или Assembly_YY.
Как я могу использовать эту DLL или ее восстановить?
ОБНОВЛЕНИЕ
Разработчики dll, наконец, ответили на мой запрос о помощи. Единственная работа, о которой они знают, - это использовать Visual Studio 2013 вместо Visual Studio 2015 или 2017. Кажется, VS 2013 не беспокоит эта двойная ссылка вообще.
Они пишут, что ошибка создается средством шифрования для dll.
Спасибо всем за ваши идеи и помощь.
Ответы
Ответ 1
Похоже, что первая DLL ссылается на библиотеку, которая является более высокой версией, чем другая DLL, которую вы используете.
чтобы у вас было 3 DLL: A, B и Bv2
Ваш проект ссылается на A и B
Но A ссылки Bv2 (обновленная версия B)
Итак, когда вы идете использовать функции A, он выдает ошибку, потому что находит B вместо Bv2.
Ответ 2
Проблема в том, что вы ссылаетесь на "Assembly_X", который ссылается на сборки Assembly_YY версии 12.3.0.0 и 65535.65535.65535.65535, и вы ссылались только на "Assembly_YY" версии 12.3.0.0 в своем приложении и не ссылались на 65535.65535.65535.65535
Теперь в соответствии с объяснением проблемы Документы Microsoft и ваш пример, в котором у вас нет исходного кода для собраний, которые у вас есть в:
Добавьте ссылку на "Assembly_YY" версию 65535.65535.65535.65535 из DLL в приложение, чтобы скомпилировать ее и включить запуск приложения, вы можете предоставить файл конфигурации приложения, который включает <dependentAssembly>
, который использует <assemblyIdentity>
и <codeBase>
дочерние элементы, чтобы указать расположение версии 12.3.0.0 DLL.
Ответ 3
Вы ссылаетесь на более высокую версию DLL, а затем на ту, которая у вас есть.
Вам нужно будет добавить ссылку на сборку более высокой версии:
'Assembly_YY, Version=65535.65535.65535.65535, Culture=neutral, PublicKeyToken=c878e80841e75d00'
чтобы решить эту проблему.
Сейчас вы ссылаетесь на
'Assembly_X' with identity 'Assembly_X, Version=12.3.0.0, Culture=neutral, PublicKeyToken=c878e80841e75d0
Если это загружаемая библиотека, найдите ее в диспетчере пакетов nuget и загрузите ее.
Если это библиотека, написанная вами, получите последнюю версию библиотеки и добавьте ее в свой проект.