Что .NET подразумевает под «основным» при выборе между ссылками на конфликтную DLL?

#.net

#.net

Вопрос:

У меня возникли некоторые проблемы с версией dll, присутствующей в манифесте, и фактической версией, присутствующей в папке сборки. Изменение параметра сборки на подробный дало эту информацию:

Произошел конфликт между «Microsoft.Практика.Библиотека предприятия.Общий, версия = 5.0.505.0, Культура = нейтральный, PublicKeyToken=31bf3856ad364e35» и «Microsoft.Практика.Библиотека предприятия.Общий, версия = 6.0.0.0, Культура = нейтральный, PublicKeyToken=31bf3856ad364e35 «.

«Microsoft.Практика.Библиотека предприятия.Общий, версия = 5.0.505.0, культура = нейтральный, PublicKeyToken= 31bf3856ad364e35» был выбран потому, что он был основным и «Microsoft.Практика.Библиотека предприятия.Общий, версия = 6.0.0.0, Культура = нейтральный, PublicKeyToken=31bf3856ad364e35» не было.

Во втором разделе говорится, что конкретная версия была выбрана как основная.

Что означает primary?

С уважением.

Комментарии:

1. Смотрите также learn.microsoft.com/visualstudio/msbuild/errors/msb3277 для получения дополнительной информации и предложений по устранению этой проблемы.

Ответ №1:

Вы просите MSBuild решить проблему с DLL-адом. Он должен копировать Microsoft.Практика.Библиотека ENTERPRISE.Обычный.dll в ваш выходной каталог сборки, чтобы вы могли запускать свою программу. Но вы ссылаетесь на две разные версии. Это не сработает, одно перезапишет другое, и это дерьмо, кто победит.

Поэтому ему нужно угадать, какой из них более «важен». Одна из ваших сборок имеет «основную» зависимость, она напрямую ссылается на типы внутри Microsoft.Практика.Библиотека ENTERPRISE.Common.dll . Еще одна из ваших сборок имеет косвенную зависимость, она использует сборку, которая была собрана с версией 6.0.0.0 asssembly. MSBuild, вынужденный угадывать, предполагает, что основной является более важным.

Это всего лишь предположение. Это может сработать, вам нужно <BindingRedirect> в файле app.exe.config сопоставить запрос для версии сборки 6.0.0.0 с версией 5.0.505.0, поскольку версия 6.0.0.0 будет недоступна. Наличие значительного несоответствия версий никогда не является хорошей новостью, исключение TypeLoadException или MissingMethodException во время выполнения не должны вас удивлять. Если это не сработает, то установка этих сборок в GAC может быть обходным путем, нет необходимости копировать библиотеки DLL таким образом. Конечно, реальное исправление заключается в том, чтобы иметь только одну конкретную зависимость.