59650


公式でSerialPortが.NetCore3.0でサポートされているように記述されているにもかかわらず、コードを書くと参照できない旨のエラーが出てきます。  
<https://docs.microsoft.com/en-
us/dotnet/api/system.io.ports.serialport?view=netcore-3.0>

どのようにすれば使用できるのでしょうか。または、そもそも使用できないものなのでしょうか。


CC BY-SA 4.0
2019-10-11T18:36:42.760
59649
2019-10-12T14:38:01.313
34135
question
c#
.Net Core 3.0でのSerialPort使用方法


ビルド結果のエラーコードとか、エディタ画面の対象部分の赤い波線表示にカーソルを合わせた際のIntelliSenseにガイドが出てきますが、`System.IO.Ports`アセンブリへの参照の追加(=NuGetパッケージのインストール)が必要です。

.NET
Frameworkだと、`System.IO.Ports`あたりはデフォルトで入っている`System`への参照があるため、ソースに`using`を追記するだけで特に何もせずに済みますが、.NET
Coreの場合は明示的に参照の追加(=NuGetパッケージのインストール)が必要になります。

「プロジェクト」メニューの「NuGetパッケージの管理」を選択して出てくる画面の「参照」をクリックし、「検索」のフィールドに`System.IO.Ports`と入力して出てくる同名のパッケージをクリックすると、右側のペインに色々表示されます。今のところは最新版をそのままインストールでしょうか。

提示されている`SerialPort Class`のExamplesソースをそのまま.NET
Coreコンソールプロジェクトにコピーし、上記NuGetパッケージをインストールすれば、ビルド出来るようになるはずです。

ちなみに追加でコード分析用パッケージをインストールし、ビルド時のコード分析を有効にしていると、多数の警告が出てきますがビルドそのものは出来ています。

* * *

**追記**  
プロジェクト作成時のデフォルトに含まれていない理由については、知っている訳ではなく推測ですが、ビルド結果のプログラム/パッケージサイズを小さく保つためでしょう。  
例えばコンソールとか標準入出力しか使わずテキスト/データ処理だけ行うプログラムには、シリアルポート処理は不要な機能であり、それをリンクしなければサイズは小さくなります。

Raspberry
Piのような小さなボードコンピュータでも動くクロスプラットフォームなプログラムはサイズも小さい方が良いので、色んな機能を関連するなるべく小さな塊に分割して、最初は何も参照していない状態で、必要なものだけ取り入れることが出来るようにし、出来上がりのサイズを小さくしているのだと思われます。

そして .NET関連ならば、プロジェクトの対象フレームワークが .NET Standard か .NET Core
で、インストールが正常に出来たパッケージは、おそらくクロスプラットフォーム対応でしょう。  
[パッケージでプロジェクトのターゲット フレームワークはサポートされますか?](https://docs.microsoft.com/ja-
jp/nuget/consume-packages/finding-and-choosing-packages#does-the-package-
support-my-projects-target-framework)

> NuGet でパッケージがプロジェクトにインストールされるのは、そのパッケージのサポートされているフレームワークにプロジェクトのターゲット
> フレームワークが含まれている場合のみです パッケージに互換性がない場合、NuGet はエラーを表示します。

ただし、`SerialPort`は以前はWindows上のみサポートで、今回の3.0でLinux用が加わったけれども、まだまだ課題がいっぱいで動作には制限があるそうです。  
[Linux 用 SerialPort](https://docs.microsoft.com/ja-jp/dotnet/core/whats-
new/dotnet-core-3-0#serialport-for-linux)

> .Net Core 3.0 では、Linux
> 上の[System.IO.Ports.SerialPort](https://docs.microsoft.com/ja-
> jp/dotnet/api/system.io.ports.serialport)に対する基本サポートを提供しています。  
>  以前の .NET Core では、Windows 上の`SerialPort`の使用のみをサポートしていました。  
>  Linux 上のシリアル ポートの制限付きサポートの詳細については、[GitHub 問題
> #33146](https://github.com/dotnet/corefx/issues/33146)を参照してください。


CC BY-SA 4.0
2019-10-11T23:51:24.943
59650
2019-10-12T14:38:01.313
2019-10-12T14:38:01.313
26370
26370
59649
answer