web-dev-qa-db-ja.com

Windowsクラスライブラリから.NET標準ライブラリを参照する

現在、私のソリューションには2つのプロジェクトがあります:Windowsクラスライブラリ(.NET Framework 4.6.1を対象とするおよび別のクラスライブラリ。NET Standard 1.3。 Visual Studio 2015 Update 3を使用します。

他のプロジェクトから.NET Standardプロジェクトへの参照を追加し、参照のリストに表示されますが、それらを使用したいときに、参照されたライブラリのクラスまたは名前空間が表示されません参照されたライブラリは正常にビルドされ、エラーはありません)。

これは、.NET標準ライブラリプロジェクトのproject.jsonです。

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0"
  },

  "frameworks": {
    "netstandard1.3": {
      "imports": "dnxcore50"
    }
  }
}

.NET 4.6.1プロジェクトでは.NET Standard 1.3ライブラリを使用できると考え、さらに低いバージョン(1.0)を使用しようとしましたが、結果は同じです。ここに何が欠けていますか?

走ったら

ドットネット復元

それもうまくいきます:

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.
17
Bedford

Windowsクラスライブラリから.NET Coreプロジェクトを参照するshouldは可能です。ただし、.NET標準ライブラリは、以前のバージョンの4。 .NET標準ライブラリは、パッケージであり、.NET Framework内の既に存在するのコンポーネント(たとえば、4.6.1)です。違いは、.NET Standardライブラリがクロスプラットフォームの.NET Standardフレームワーク用に構築されていることです。

Project.json-fileの"frameworks"セクションで複数のフレームワークをターゲットにすることができます。

その間、"NETStandard.Library"- dependencyも"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の一部であるためです。

たとえば、not .NETStandardライブラリの一部ですが、.NET 4.6.1フレームワークの一部である何かを参照したいとします。私の職場でのこの一般的なケースは、System.ComponentModel.DataAnnotationsです。これは.NET Frameworkの一部ですが、.NET Standardフレームワーク用の別個のパッケージです。

その後、"net461"の場合はframework Assemblyとして参照する必要がありますが、"netstandard1.x"フレームワークの場合はdependencyとして参照する必要があります。

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フィード を設定できます。

次に、NuGetパッケージマネージャーコンソールでInstall-Packageコマンドレットを使用します。

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

パッケージマネージャーは、正しいバージョンのパッケージ(.NET 4.6.1)を参照します。

17
die maus

完全なフレームワークをターゲットとするプロジェクトで.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"/>を使用します。

18
meziantou

PCLとしてビルドされておらず、クロスプラットフォームではないため、PCLプロジェクトで一部のライブラリを使用することはできません。一部の名前空間はPCLプロジェクトでは使用できず、リストされていません here

以下のアセンブリは、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)

ただし、これらのアセンブリのすべてがすべてのプラットフォームでサポートされるわけではありません。

2
Salah Akbari