Использование библиотеки .NET 4.0 с другими зависимостями из проекта .NET 4.5.1

#.net-4.0 #nuget #mvvm-light #.net-4.5

#.net-4.0 #nuget #mvvm-light #.net-4.5

Вопрос:

У меня есть проект .NET, целевой платформой которого является 4.5.1. Этот проект зависит от библиотеки NuGet, которая имеет только версию .NET 4.0, а эта библиотека, в свою очередь, зависит от MVVMLight:

MyProject (4.5.1) -> Зависит от MyLibrary (4.0) -> Зависит от MVVMLight (4.0)

У NuGet MVVMLight также есть версия 4.5, поэтому, когда он устанавливается в MyProject, он в конечном итоге ссылается на версию 4.5 (в отличие от MyLibrary, которая была скомпилирована с MVVMLight для .NET 4.0).

Это приводит к следующей ошибке компиляции:

5>…Adorners CircleAdorner.cs(19,18,19,31): ошибка CS0012: тип ‘GalaSoft.MVVMLight.ObservableObject’ определен в сборке, на которую нет ссылки. Необходимо добавить ссылку на сборку ‘GalaSoft.MVVMLight, Version = 4.4.32.18939, Culture = нейтральный, PublicKeyToken = null’.

Ошибка связана с классом CircleAdorner , который наследует от класса, определенного в MyLibrary, который, в свою очередь ObservableObject , наследует от MVVMLight .

Является ли эта ситуация «законной»? Можно ли ссылаться на библиотеку .NET 4.0 из проекта .NET 4.5.1? Насколько я понимаю, все должно быть в порядке. Однако загвоздка здесь в том, что проект .NET 4.0 ожидает другую зависимость, которая здесь не удовлетворяется.

Кроме того, я заметил, что DLL-версия GalaSoft.MVVMLight для .NET 4.5 равна 4.4.32.39728, а не 4.4.32.18939. В проекте я пометил эту ссылку, <SpecificVersion>False</SpecificVersion> но это не помогло.

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

1. Зависимость 4.0 в порядке. Иметь зависимость от двух совершенно разных версий библиотеки — это нехорошо. DLL Ад сожжет вас.

Ответ №1:

Да, для проекта .NET 4.5.1 разрешено использовать сборку .NET 4.0. .NET 4.5 — это обновление на месте до .NET 4.0, и оно обратно совместимо.

С точки зрения NuGet, если версия целевой платформы проекта меньше или равна версии сборки в пакете NuGet, то они считаются совместимыми. Таким образом, NuGet позволит вам добавить пакет NuGet, предназначенный для .NET 4.0, в проект, предназначенный для .NET 4.5. Чего вы не можете сделать, так это добавить пакет NuGet, предназначенный только для .NET 4.5, в проект, предназначенный для .NET 4.0, поскольку сборки в пакете NuGet могут использовать части . .NET framework, который не входит в состав .NET 4.0.

При установке пакета NuGet выберет самую высокую версию пакета.Сетевая платформа, содержащаяся в пакете NuGet, совместима с вашим проектом.

При несоответствии версии GalaSoft.MVVMLight вы сможете решить проблему, используя один из двух вариантов:

  1. Обновите MyLibrary, чтобы использовать ту же версию MVVMLight, что и ваш проект.
  2. Добавьте перенаправление привязки к app.config вашего проекта для GalaSoft.MVVMLight, чтобы ссылка MyLibrary на него была сопоставлена с более поздней версией. Если вы используете Visual Studio 2013 и пишете настольное приложение .NET 4.5.1, вы можете включить автоматическое перенаправление привязки вместо обновления вашего app.config.

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

1. Спасибо. 1. MyLibrary использует ту же версию MVVMLight, что и MyProject. Однако пакет NuGet для MVVMLight содержит разные версии DLL для .NET 4.0 и для .NET 4.5 … 2. Разве привязка не выполняется только во время выполнения? У меня проблема с компиляцией…

2. Вы правы. Привязка не исправит вашу ошибку во время компиляции. Пакет NuGet должен быть исправлен, иначе вы не сможете использовать NuGet и должны будете использовать правильную сборку в обход NuGet. Возможно, стоит сообщить об этой проблеме на сайте MVVMLight codeplex.

3. Перенаправление привязки может сработать, если вы не компилируете свою MyLibrary одновременно с MyProject. Наличие ссылки MyProject на сборку напрямую или упаковка ее как собственного пакета NuGet. Это обходной путь. Действительно, пакет NuGet должен быть обновлен.