#.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 вы сможете решить проблему, используя один из двух вариантов:
- Обновите MyLibrary, чтобы использовать ту же версию MVVMLight, что и ваш проект.
- Добавьте перенаправление привязки к 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 должен быть обновлен.