Ссылка на стандартные библиотеки a.net из класса библиотеки Windows

в моем решении в настоящее время есть два проекта: A библиотека классов Windows (ориентированная на .NET Framework 4.6.1) и другая библиотека классов, которая нацелена на .NET стандарт 1.3. Я использую обновление 3 для Visual Studio 2015.

я добавил ссылку на проект .NET Standard из другого проекта, и он появляется в списке ссылок, но я не вижу ни одного из классов или пространств имен из ссылочной библиотеки, когда я хочу их использовать (хотя ссылочная библиотека была успешно построена и не имеет ошибок).

этот проект.json для проекта стандартной библиотеки .NET:

{
  "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:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.Entitiesproject.json...
log  : Restoring packages for C:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.Parserproject.json...
log  : Writing lock file to disk. Path: C:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.Parserproject.lock.json
log  : C:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.ParserPWBSpreadsheet.Parser.xproj
log  : Restore completed in 408ms.
log  : Writing lock file to disk. Path: C:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.Entitiesproject.lock.json
log  : C:UsersZsoltDocumentsVisual Studio 2015ProjectsPWBPWBSpreadsheet.EntitiesPWBSpreadsheet.Entities.xproj
log  : Restore completed in 417ms.

3 ответов


ссылка на проект .NET Core из библиотеки классов Windows должны можно. Однако-стандартная библиотека .NET не "напрямую совместима" с предыдущими версиями .NET Framework, т. е. 4.6.1 или ниже. Стандартная библиотека .NET-это пакета С компонентами, которые уже есть в .NET Framework (например, 4.6.1). Разница в том, что библиотека .NET Standard построена для кроссплатформенного .NET Standard рамки.

вы можете выбрать несколько рамок под "frameworks" раздел в вашем проекте.json-файл.

при этом вы также должны переместить "NETStandard.Library"-зависимость прямо под "netstandard1.x"-рамки.

пример проекта.в JSON

{
  "version": "1.0.0-*",

  "dependencies": { },

  "frameworks": {
    "net461": { },
    "netstandard1.3": {
      "dependencies": {
        "NETStandard.Library": "1.6.0"
      },
      "imports": "dnxcore50"
    }
  }
}

это гарантирует, что вы не включаете никаких лишних зависимостей к библиотеке NET Standard, поскольку эти зависимости будут включены только при построении Чистая стандартная структура. При построении на платформе .NET Framework 4.6.1 эти зависимости опущены. Это нормально-поскольку эти зависимости уже являются частью .NET Framework (как описано выше).

теперь скажем, например вы хотите ссылаться на то, что не часть .Библиотека NETStandard, но часть платформы .NET 4.6.1. Обычное дело для этого на моем рабочем месте System.ComponentModel.DataAnnotations. Это часть .NET Framework, но отдельный пакет для стандарта .NET рамки.

затем вам придется ссылаться на него как на основы сборки на "net461", а как зависимость на "netstandard1.x" основы.

пример проекта.в 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-feed. Вы можете настроить местный канал NuGet для этой цели.

тогда просто используйте в консоли диспетчера пакетов NuGet.

Install-Package <your-package> -v 1.0.0-<x>

в package-manager будет ссылаться на правильную версию пакета (.NET 4.6.1).


ссылка на .NET Standard в проекте, предназначенном для полной платформы, пока работает неправильно. Вместо этого ваш проект должен быть нацелен на несколько фреймворков.

если вы используете новый инструмент (с VS 2017), т. е. формат проекта csproj, вы можете установить несколько целей в TargetFrameworks tag:

<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"/>.


вы не можете использовать некоторые библиотеки в проектах PCL, потому что он не построен как PCL, и это не кросс-платформенный. Некоторое пространство имен недоступно в проектах PCL, и оно не указано здесь.

в проекте переносимой библиотеки классов доступны следующие сборки:

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)

однако, не все эти сборки, поддерживаемые на всех платформах.