21

したい:

  • いくつかのインターフェイスと単純な汎用ヘルパー クラスを定義するクラス ライブラリを作成します。ジェネリック コレクションに依存します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 アプリから参照できるようにするには、クラス ライブラリの に何を入れる必要がありますか? これは本当に正しいアプローチですか、それとも間違った足で始めたのでしょうか?

4

2 に答える 2

34

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

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

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

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

ベースのクラス ライブラリを作成することに決めたxproj場合、[参照の追加] ダイアログが機能しない場合 ( 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 テスト ランナーから取得したものです。

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

完全な Rx.NET ソリューションはこちらで確認できます。これには、xproj->xproj参照と上記の UWP ->xproj参照が含まれています。

于 2016-06-19T13:55:21.550 に答える
3

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

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

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

それが「多すぎる」場合は、*.csproj と *.xproj という 2 つのプロジェクトを 1 つのフォルダーに作成することもできます。*.csproj は .NET 4.6 Framework を対象とし、*.xproj は上で指摘したとおりのままで、複数の対象があります。このセットアップでは、参照を追加するだけで、通常は以前に使用した方法でプロジェクトを参照できます (同じソリューション内にある場合)。

于 2016-06-19T00:30:10.413 に答える