質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
.NET Standard

.NET Standardは、さまざまな.NET環境で用いることができる基本的なAPIセットまたはそれを定めた仕様です。この標準に沿って.NET実装を行うことで、どのプラットフォームでも動くポータブルなライブラリを作成できます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

6219閲覧

.NET Frameworkプロジェクトから .NET Standardのライブラリを参照する方法を知りたい。

firstlast

総合スコア138

.NET Standard

.NET Standardは、さまざまな.NET環境で用いることができる基本的なAPIセットまたはそれを定めた仕様です。この標準に沿って.NET実装を行うことで、どのプラットフォームでも動くポータブルなライブラリを作成できます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/12/24 22:35

編集2018/12/25 01:52

前提・実現したいこと

.NET Frameworkプロジェクトから .NET Standardのライブラリを参照する方法を知りたい。
.NET StandardはNugetでプロジェクトにインストールしました。
検証用に作成したソースコードを下に載せておきます。
よろしくお願いします。

該当のソースコード

C#

1using System; 2using System.Windows.Forms; 3 4namespace WindowsFormsApp1 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 } 12 13 private void Form1_Load(object sender, EventArgs e) 14 { 15 System.Collections.Generic.List<string> stringList = new System.Collections.Generic.List<string>(); 16 stringList.Add("にゃんにゃん"); 17 stringList.Add("わんわん"); 18 MessageBox.Show(stringList.Count.ToString()); 19 } 20 } 21}

試したこと

.NET Standardに実装があるとされているSystem.Collections.Generic.Listクラス(*1)の定義に移動して実装先を確認したところ、.NET Frameworkのアセンブリを参照していました。
イメージ説明
(*1) https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1?view=netstandard-2.0

環境

Microsoft Windows 10 Pro (Version 1809)
Microsoft Visual Studio Community 2017(Version 15.9.4)
Microsoft .NET Framework(Version 4.7.03190)

###追加
以下のようなクラスライブラリ(.NET Standard)を作り、

C#

1using System; 2 3namespace TestLibrary1 4{ 5 public class Animal 6 { 7 public int Aaa() 8 { 9 System.Collections.Generic.List<string> stringList = new System.Collections.Generic.List<string>(); 10 stringList.Add("にゃんにゃん"); 11 stringList.Add("わんわん"); 12 return stringList.Count; 13 } 14 15 } 16}

以下のようなWindowsフォームアプリケーション(.NET Framework)で参照して呼び出す。

C#

1using System; 2using System.Windows.Forms; 3 4namespace WindowsFormsApp1 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 } 12 13 private void Form1_Load(object sender, EventArgs e) 14 { 15 //System.Collections.Generic.List<string> stringList = new System.Collections.Generic.List<string>(); 16 //stringList.Add("にゃんにゃん"); 17 //stringList.Add("わんわん"); 18 //MessageBox.Show(stringList.Count.ToString()); 19 MessageBox.Show(new TestLibrary1.Animal().Aaa().ToString()); 20 } 21 } 22}

イメージ説明
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

NETStandardはあくまでインターフェース定義であり、その実装はランタイムのものを使用するため、その動作で正しいです。NETStandard上の定義を利用するのはアプリケーション側ではなくライブラリ側であり、「NETStandardの上に作られたライブラリは、NETStandardをサポートする複数のランタイムで動作させられる」というだけです。NETStandard.Libraryは基本的に手でインストールするものではなく、NETStandardをサポートするライブラリを利用する際に勝手についてくるものと考えてください。
例えば「NETStandard2.0をターゲットにしたパッケージを使いたい」という状況では、自プロジェクトのターゲット(==ランタイム)が.NET Framework4.6.1以上なら、何もしなくても普通のパッケージと同じようにインストールして使えます。
metadataビューでnetstandardを参照しているところを見てみたいなら、NETStandardをメインターゲットとしたDLLプロジェクトを新規作成してみてください。

なにか、「本当にやりたかったこと」があって、その上でこの質問が出てきたように見えますけど、この回答で解決しますでしょうか?

投稿2018/12/25 00:29

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2018/12/25 02:19

ソースコードにあるジェネリックリストクラスは、.NET Frameworkにも.Net Standardにも存在するため、わざわざ.NET Standardのクラスを参照する必要はないのですが、.Net Frameworkに実装されていない.NET Standardには実装されているようなクラスが仮にあるとした場合に、どうやって参照したらいいのかがわからないのです。
tamoto

2018/12/25 02:43

逆です。.NET Frameworkに実装されていないクラスはNETStandardに存在しません。存在できません。それは、「.NET Framework v4.XはNET Standard verX.Xをサポートしていない」ということと同義です。「NETStandardをサポートしている」というのは、NETStandardに定義されたAPIをランタイム(==.NET Framework)が全て実装しているという意味になります。 例えると、C#でインターフェースに定義されたメソッドの一部が実体クラスに実装されていない状況を思い浮かべてください。それはコンパイルエラーです。
firstlast

2018/12/25 05:03 編集

逆だったんですね。なるほどです。.NET Frameworkと.NET Standardで、同じ名前空間の同じクラスがあるのにどうやって区別するんだろうって思っていたんですけど、それは間違った考えでした。 ありがとうございました。m(_ _)m
firstlast

2018/12/25 05:27 編集

何の根拠もないのですが、.NET Standardの名前空間は、.NET Framework, .NET Core, Xamarinなどのクラスライブラリごとに分類されていると勝手にイメージしていました。
tamoto

2018/12/25 05:26

NETStandardはAPI定義のみを持つ「実質的にインターフェース」なので、参照先は実行環境(.NET Framework)の実装に転送されます。NETStandardを参照して作るライブラリとは、「そういうメソッドがあると仮定してプログラムする」もので、実際にライブラリを使用するときにランタイムの実装に差し替えられます。 同じノード、とは、何を指しているのかいまいち読み取れないのですが、名前空間は自由に定義できるのでクラスライブラリの分割とは関係ないものです(実際は機能単位でアセンブリを分けたとき、だいたい一つの機能は名前空間で分離されていることが多いだけです)。
firstlast

2018/12/25 05:31

>名前空間は自由に定義できるのでクラスライブラリの分割とは関係ないものです(実際は機能単位でアセンブリを分けたとき、だいたい一つの機能は名前空間で分離されていることが多いだけです)。 なるほどです。ありがとうございます。 ※返信を見る前に回答を修正してしまいました。すみません。
guest

0

ベストアンサー

質問が「.NET Frameworkプロジェクトから .NET Standardのライブラリを参照する方法を知りたい。」な為、回答を躊躇しましたが、質問者さんが最終的にやりたいことは.NET FrameworkのWindows Formsのプロジェクトの中でSystem.Collections.Generic.List<T>を使いたい、ということではありませんか。であればそもそもnugetで.NET Standardのライブラリをインストールする必要は無いです。(混乱するだけ)

System.Collections.Generic.List<T>は.NET Framework上でそのまま使えます。

投稿2018/12/25 01:00

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2018/12/25 01:36

おっしゃる通り、正確には .NET FrameworkのWindows Formsのプロジェクトの中でSystem.Collections.Generic.List<T>を使いたい です。
dodox86

2018/12/25 01:54

であれば回答にも書きましたとおり、プロジェクトを新規作成した後、nugetでインストールしなくてもご提示のコードそのままでビルドできますし、問題なく実行できます。少なくともご提示のコードであれば、.NET Famework のバージョンは2.0 からOKです。nugetでインストールしたものはアンインストールするかいっそプロジェクトを新規作成してください。
firstlast

2018/12/25 02:23 編集

すみません。言葉足らずでした。 System.Collections.Generic.Listはあくまでも例として使わせていただいたのので、正確には 「Windowsフォームアプリケーションから、netstandard.dllのなかのクラスを使いたい」ということになります。
firstlast

2018/12/25 02:28

.Net Frameworkに実装されていない.NET Standardには実装されているようなクラスが仮にあるとした場合に、どうやって参照したらいいのかがわからないのです。
dodox86

2018/12/25 02:57

そうですと私の回答はお求めのものとは違うと思いますので無視してくださって構いません。前提が一般的ではないと思いますので、Qiitaで参考になる記事がありましたのでご案内します。ttps://qiita.com/shuhey/items/f1e3c03c724d54cec9bf 通常、プロジェクトで選択した.NET Framework では.NET Standardの各バージョンの仕様を満たし、実装を内包しています。なので質問者さんのような状況は起きません。無理をしてその状況をつくるとすれば.NET Framework 2.0 + .NET Standard Library 2 のような状況ですが、nugetではインストール要件を満たさないのでインストールできません。Reflectionを使えばあるいはロードして使うこともできるかもしれません(<多分無理でしょうが)が、プロジェクトの参照で追加して使うわけではないので、それも要望を満たすものではありません。
firstlast

2018/12/25 05:00

>通常、プロジェクトで選択した.NET Framework では.NET Standardの各バージョンの仕様を満たし、実装を内包しています。 なるほど、腑に落ちました。各.NET実装において.NET Standardが実装されているということですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問