web-dev-qa-db-ja.com

.NET Coreクラスライブラリを作成し、.NET 4.6プロジェクトから参照するにはどうすればよいですか?

したい:

  • いくつかのインターフェイスと単純な汎用ヘルパークラスを定義するクラスライブラリを作成します。汎用コレクションと_IQueryable<T>_に依存しますが、サードパーティの依存関係は使用しません(まあ、_JetBrains.Annotations_)。
  • どこからでもそのクラスライブラリを参照できるようにする(具体的にはUWP、net46、ASP.Net Core RC2)
  • 理想的には、全体を通してproject.jsonシステムを使用しますが、必要に応じてそれを犠牲にする準備ができています。
  • 完成したライブラリをNuGetフィードに公開し、そこから他のアプリで使用します

Visual Studio 2015.2でクラスライブラリプロジェクトを作成すると、次のことを示すClass Library (.NET Core)テンプレートが見つかりました。

任意のプラットフォームを対象とすることができるNuGetパッケージとしてクラスライブラリを作成するためのプロジェクトテンプレート

任意のプラットフォーム!素晴らしい...しかし、私はそれを動作させることができません。多くのいじりの後、私は現在、次の_project.json_を持っています(おそらく今では完全に壊れています):

_{
"title": "My Really Useful Class Library",
"copyright": "Copyright © 2015-16 Tigra Astronomy, all rights reserved",
"description": "Really neat stuff",
"language": "en-GB",
"version": "1.0.0-*",
"dependencies": {
    "JetBrains.Annotations": "10.1.4",
    },
"frameworks": {
    "netstandard1.5": {
        "imports": "dnxcore50",
        "dependencies": {
            "NETStandard.Library": "1.5.0-rc2-24027",
            "System.Linq.Expressions": "4.0.11-rc2-24027"
            }
        }
    "net46": {
        "frameworkAssemblies": {
            "System.Collections": "4.0.*"
            },
        "dependencies": {}
        }
    },
    "buildOptions": {
        "xmlDoc": true
        }
}
_

次に行ったのは、同じソリューションで.NET Framework 4.6プロジェクトを作成し、クラスライブラリを参照しようとしたことです。参照を追加できますが、ビルドエラー、未解決のシンボル、R#が不満などを取得しています。

私はそれを正しくやっていないと思います(暗闇で手探りしているので、本当に驚きません)。

TFM、フレームワーク、ライブラリに関するドキュメントをいくつか読みましたが、実際にはあまり意味がありません。

クラスライブラリの_project.json_に実際に何を入れる必要があるのですか。それは、.net framework 4.6アプリから、またUWPおよびASP.NET Core RC2アプリからも参照できるようにするためです。これは本当に正しいアプローチですか、それとも間違った方向から始めましたか?

20
Tim Long

現在、C#プロジェクトを作成するには、xprojcsprojの2つの方法があります。両方にproject.jsonを使用していると仮定すると、それはプロジェクトの種類によって異なります。xprojの場合、project.jsonにはプロジェクトのビルドに必要なすべてが含まれます。 csprojの場合、Nuget依存関係のみが含まれます。

ただし、UWPなどの一部のプロジェクトタイプは、xproj/project.jsonがサポートするものよりも複雑なビルドパイプラインが必要なため、xprojでビルドできません。 (ところで、これがmsbuildに戻る主な理由の1つでした。)

.NET Standardベースのクラスライブラリを作成するには、2つの方法があります。xprojproject.jsonと共に使用することもできます。または、通常のcsproj "Portableを作成することもできます。クラスライブラリ」プロジェクト。 VS 2015 Update 3 RCでは、PCLを変更して.NET Standardバージョン(PCLプロファイルの代わりにnetstandard1.x、259など)をターゲットにできます。

csprojベースのクラスライブラリを使用してnetstandard1.xを対象とする場合、プロジェクト参照を追加するときに問題なく機能するはずです。 UWPは現在、 プラットフォームマップ に基づいてnetstandard1.4までサポートしていることに注意してください。問題は、代わりにxproj/project.jsonベースのプロジェクトを使用するかどうかです。今日xprojを使用する主な理由の1つは、複数のターゲットフレームワーク間のクロスコンパイルを有効にすることです。つまり、プロジェクトから複数の出力を作成します。これは、互換性のあるプロジェクトから参照できる単一の出力を作成することとは異なります。どちらにも用途がありますが、ニーズによって異なります。

xprojベースのクラスライブラリを作成する場合は、[参照の追加]ダイアログが機能しない場合(UWPプロジェクトまたは他の互換性のあるプロジェクトタイプから参照するために使用できる回避策があります) csproj-> xprojはほとんど壊れているため)ダイアログを使用する代わりに、次のようにcsprojの出力を指すようにUWP xprojを編集します。

<Reference Include="System.Reactive.Interfaces">
  <HintPath>..\System.Reactive.Interfaces\bin\$(Configuration)\netstandard1.0\System.Reactive.Interfaces.dll</HintPath>
</Reference>

上記のスニペットは、Rx.NET UWPテストランナーから取得したものです here

これを行う場合、MSBuild/Visual Studioがそれを認識せず、間違った順序で物事を構築するため、UWPプロジェクトからxprojにビルド依存関係を追加する必要があります。これを行うには、ソリューションエクスプローラーでUWPプロジェクトを右クリックし、[ビルドの依存関係->プロジェクトの依存関係]を選択します。そのダイアログで、xprojのボックスをチェックして、VS/MSbuildが最初にビルドすることを確認します。

ここで完全なRx.NETソリューションを見ることができます。これには、上記のxproj->xproj参照とUWP-> xproj参照が含まれます。

33
Oren Novotny

新しいプロジェクトテンプレート/.xprojの動作は少し異なります。新しいクラスライブラリ(およびアプリケーションテンプレート)は、プレーンアセンブリではなく、nugetパッケージを生成します。

そのnugetパッケージ内には、すべてのターゲットが含まれています。つまり、他のnugetパッケージを追加するのと同じ方法で新しいプロジェクトを追加します。nugetをnugetフィードに入れ、Visual Studioでこれを参照してからそこから取得します。

実行中のNugetサーバーがない場合(Visual Studio Team Services + NuGetパッケージ、myget、セルフホスト)、パッケージをフォルダー(ローカルまたはネットワーク共有)に入れて、このフォルダーをNugetソースとして追加することもできます。

それがあまりにも多くの場合、1つのフォルダーに2つのプロジェクトを作成することもできます:* .csprojと* .xproj。 * .csprojは.NET 4.6 Frameworkを対象とし、*。xprojは上記のように残り、複数のターゲットを持ちます。この設定では、参照を追加するだけで、以前と同じ方法でプロジェクトを参照できます(同じソリューション内にある場合)。

3
Tseng