2016-10-04 12 views
2

私のソリューションには2つのプロジェクトがあります。まず、.NET標準1.3をターゲットとする移植可能なライブラリです。このライブラリはJson.NETに依存しています。そのproject.jsonは、次のようになります。.NET 4.6.1アプリケーションから.NET Standard 1.3ライブラリを参照すると依存関係が機能しない

{ 
    "supports": {}, 
    "dependencies": { 
    "Microsoft.NETCore.Portable.Compatibility": "1.0.1", 
    "NETStandard.Library": "1.6.0", 
    "Newtonsoft.Json": "9.0.1" 
    }, 
    "frameworks": { 
    "netstandard1.3": {} 
    } 
} 

図書館だけで、この単純なクラスで構成されています

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace TestLibrary 
{ 
    public class TestClass 
    { 
     public static string Foo() { 
      return JsonConvert.SerializeObject(42); 
     } 
    } 
} 

第二のプロジェクトは完全な.NETに4.6.1フレームワークをターゲットコンソールアプリケーションです。このコンソールアプリケーションは、上記のライブラリを参照します。コードは以下の通りです:

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = TestLibrary.TestClass.Foo(); 
     } 
    } 
} 

を、私はそれをビルドして実行することができるよ、しかし、例外を以下にTestLibrary.TestClass.Foo()結果を呼び出す:

は、バージョン= 9.0のファイルまたはアセンブリ」Newtonsoft.Jsonをロードできませんでした。 0.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed 'またはその依存関係の1つ。システムは、指定されたファイルを見つけることができません。 ":" Newtonsoft.Json、バージョン= 9.0.0.0、文化=中立、なPublicKeyToken = 30ad4fe6b2a6aeed」私のbinフォルダにはNewtonsoft.Json.dllはありません

私が持っています。 Visual Studio 2015 Update 3(KB3165756)がインストールされています(14.0.25431.01、2011年9月14日リリース)。また、.NET Core 1.0.1 VS 2015ツーリングプレビュー2.

グーグルでは、 a)私は何か間違っているかどうか分からないb)ツールはこのシナリオをまだサポートしていないがc)Visual Studioのインストールが何らかの形で壊れている。

EDIT:complete solution to reproduceです。

+0

ClassLibraryとコンソールアプリケーションの両方が.NET Coreアプリケーションですか?私は両方を作成します。NETコアのClassLibraryとコンソールアプリケーションの説明に基づいて、私はエラーメッセージが表示されません。可能であれば、サンプルプロジェクトを提供することをお勧めします。自分のアプリを自分のプロジェクトで実行して、プロジェクトやVSのインストールに問題がないかどうかを確認します。 –

+0

いいえ、.NETコアではありません。ライブラリは.NET Standard 1.3をターゲットとするPCLであり、コンソールアプリケーションは完全な.NET 4.6.1フレームワークをターゲットとしています。サンプルプロジェクト[here](http://www.esentio.sk/temp/testdependencies.zip)を見つけることができます(GitHubは現在使用できません)。 – Stalker

答えて

2

PCLライブラリプロジェクトはproject.jsonファイルでパッケージを管理しますが、一般的な.NET Frameworkプロジェクトはpackages.configでNuGetパッケージを管理します。

Newtonsoft.Jsonパッケージをコンソールアプリケーションに手動でインストールするかどうかをテストしましたが、これは正常に実行されました。また、project.jsonファイルでNuGetパッケージを管理する.NET Core Consoleアプリケーションを使用してPCLライブラリプロジェクトを参照すると、ソリューションも正常に実行される可能性があります。

あなたの状況では、PCLライブラリプロジェクトのNuGetパッケージをコンソールアプリケーションに手動でインストールする必要があります。

+1

はい、コンソールアプリケーションに依存関係をインストールすると動作します。そして、はい、私はそれがproject.json/packages.configの差異と関係があると思っていました。しかし、主な質問は残っています。このシナリオはツーリングによってサポートされていませんか?それは将来修正されるのだろうか?私はそれに答えを見つけることができません(多分私はそれをグーグルで悪いです)。実際の世界のシナリオははるかに複雑で、標準ライブラリプロジェクトを参照するすべてのプロジェクトで依存関係を複製する必要があるときには迷惑です。とにかく、私はあなたの答えを受け入れるでしょう、それは問題を解決するからです。 – Stalker

+0

このシナリオがサポートされていないかどうかについてのニュースもありません。 NuGetの文書によると、「詳細については、行動規範FAQを参照してください。または、opencode @ microsoft.comに追加の質問やコメントをつけてください」と言います。ですから、opencode @ microsoft.comに連絡してこの問題を提出することをお勧めします。 –

+0

project.jsonは.net標準では使用されていないため、受け入れられる回答が古くなっています。彼らは現在.csprojを使用しています。 – trampster

2

.NET標準ライブラリの依存関係を手動でインストールする必要はありません。

マイクロソフトではこれが問題であり、NuGetバージョン4.0.1ではおそらくwill fixであることを認めました。これは、VS 2017出荷後のNuGet 4の最初のアップデートです。

ここでもっともクリーンな回避策は、レガシー(この場合は.NET 4.6.1。アプリ)プロジェクトに<RestoreProjectStyle>PackageReference</RestoreProjectStyle>を追加することです。しかしaccording to Rob Relyea MSはRTMの後でこのプロパティを無視するので、もう1つの回避策は<PackageReference Update="PlaceholderToConvinceThisProjectToGetTransitivePackageReferenceFromProjectReferences"/>です。

もう1つの回避策は、that answerのようなNuGetパッケージに.NET標準ライブラリをパックすることですが、これは最も簡単な方法ではありません。

関連する問題