Ссылка на библиотеку .NET Standard из библиотеки классов Windows
В моем решении есть два проекта: Библиотека классов Windows (ориентированная на .NET Framework 4.6.1) и другая библиотека классов, ориентированная на .NET Standard 1.3. Я использую обновление Visual Studio 2015 Update.
Я добавил ссылку на проект .NET Standard из другого проекта и он отображается в списке ссылок, но я не вижу ни одного из классов или пространств имен из ссылочной библиотеки, когда я хочу их использовать (несмотря на то, что ссылочная библиотека была успешно построена и не имеет ошибок).
Это проект project.json для проекта библиотеки .NET Standard:
{
"version": "1.0.0-*",
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"frameworks": {
"netstandard1.3": {
"imports": "dnxcore50"
}
}
}
Я думал, что проекты .NET 4.6.1 могут использовать .NET Standard 1.3 libs, и я даже пытался использовать более низкие версии (1.0), но результат тот же. Что мне здесь не хватает?
Если я запустил
восстановление dotnet
он отлично работает:
log : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.json...
log : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.json...
log : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.lock.json
log : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\PWBSpreadsheet.Parser.xproj
log : Restore completed in 408ms.
log : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.lock.json
log : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\PWBSpreadsheet.Entities.xproj
log : Restore completed in 417ms.
Ответы
Ответ 1
Ссылка на проект .NET Core из библиотеки классов Windows должна быть возможной. Однако библиотека .NET Standard не "напрямую совместима" с предыдущими версиями .NET Framework, то есть 4.6.1 или ниже. Библиотека .NET Standard представляет собой пакет с компонентами, которые уже существуют в .NET Framework (например, 4.6.1). Разница в том, что библиотека .NET Standard построена для кросс-платформенной платформы .NET Standard.
Вы можете настроить несколько фреймворков в разделе "frameworks"
в файле project.json.
При этом вы также должны перемещать "NETStandard.Library"
-зависимость непосредственно в "netstandard1.x"
-framework.
Пример project.json
{
"version": "1.0.0-*",
"dependencies": { },
"frameworks": {
"net461": { },
"netstandard1.3": {
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"imports": "dnxcore50"
}
}
}
Это гарантирует, что вы не включаете лишних зависимостей в библиотеку NET Standard, поскольку эти зависимости будут включаться только при построении в соответствии с инфраструктурой NET Standard. Если они построены против .NET Framework 4.6.1, эти зависимости опущены. Это прекрасно, поскольку эти зависимости уже являются частью .NET Framework (как описано выше).
Теперь скажите, например, что вы хотите ссылаться на то, что не является частью библиотеки .NETStandard, а является частью среды .NET 4.6.1. Общим примером для этого на моем рабочем месте является System.ComponentModel.DataAnnotations
. Он является частью .NET Framework, но представляет собой отдельный пакет для платформы .NET Standard.
Затем вам нужно будет ссылаться на него как на сборку фреймворка для "net461"
, но как на зависимость для фреймворка "netstandard1.x"
.
Пример project.json
"frameworks": {
"net461": {
"frameworkAssemblies": {
"System.ComponentModel.DataAnnotations": "4.0.0.0"
}
},
"netstandard1.3": {
"dependencies": {
"NETStandard.Library": "1.6.0",
"System.ComponentModel.Annotations": "4.1.0"
},
"imports": "dnxcore50"
}
}
Как описывает @meziantou:
Ссылка на .NET Standard в проекте, который нацелен на полную структуру, работает некорректно.
Я только что протестировал его в Visual Studio 2015, и я могу подтвердить — ссылка добавляется, но вы не можете использовать какой-либо компонент ссылочной библиотеки.
Если у вас нет установленной Visual Studio 2017, единственным решением, о котором я могу думать, является dotnet pack
ваш проект и опубликовать его к NuGet-фиду. Вы можете настроить локальный фид NuGet для этой цели.
Затем просто используйте командлет Install-Package
в консоли менеджера пакетов NuGet.
Install-Package <your-package> -v 1.0.0-<x>
Пакет-менеджер будет ссылаться на правильную версию пакета (.NET 4.6.1).
Ответ 2
Ссылка на .NET Standard в проекте, который нацелен на полную структуру, работает некорректно. Вместо этого ваш проект должен быть нацелен на несколько фреймворков.
Если вы используете новый инструмент (с VS 2017), т.е. формат проекта csproj, вы можете установить несколько целевых объектов в теге TargetFrameworks
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
</PropertyGroup>
</Project>
Если вам нужно, вы можете установить разные зависимости для каждой цели:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
<PackageReference Include="Microsoft.Win32.Primitives" Version="4.3.0" />
<PackageReference Include="System.Collections" Version="4.3.0" />
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net46'">
<PackageReference Remove="NETStandard.Library" />
</ItemGroup>
</Project>
По умолчанию NETStandard.Library
автоматически добавляется. Если вы хотите удалить его, используйте PackageReference Remove="NETStandard.Library"/>
.
Ответ 3
Вы не можете использовать некоторые библиотеки в проектах PCL, потому что они не построены как PCL и не являются перекрестной платформой. Некоторое пространство имен недоступно в проектах PCL, и он не указан здесь.
В рамках проекта Portable Class Library доступны следующие сборки:
• mscorlib.dll
• System.dll
• System.Core.dll
• System.Xml.dll
• System.ComponentModel.Composition.dll
• System.Net.dll
• System.Runtime.Serialization.dll
• System.ServiceModel.dll
• System.Xml.Serialization.dll
• System.Windows.dll (from Silverlight)
Однако не все эти сборки поддерживаются на всех платформах.