「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[.NET Standard]]
--[[移行・マイグレーション]]
---[[.NETのクロスプラットフォーム対応]]

* 目次 [#o5a016dc]
#contents

*概要 [#r7faebbc]
※ 対象は、[[.NET Standard]] 2.0。
対象は、[[.NET Standard]] 2.0。

-下記の「[[移行元 / 移行先>.NETのクロスプラットフォーム対応#c59bc8d4]]」の、「[[.NET Standard]]」移行ノウハウをサマリする。~
-[[コチラ>.NET Standard#ie8e5050]]に書いた通り、PCLと比べて移行はし易い感じ。

※ [[ただし、.NET Standardは、.NET 6 で廃止予定との事。>.NET Standard#a43793fb]]

*詳細 [#u9084419]

**準備 [#k7f8bf18]

***[[移行プロセスの確認>#ncb5387c]] [#v4769a8c]

***移行性評価の実施 [#z0edc7c9]
必要に応じて、以下ツールを使用し移行性を評価する。
必要に応じて、[[移行性評価ツール>.NETのクロスプラットフォーム対応#we621859]]を使用し移行性を評価する。

-.NET Portability Analyzer
--.NET Portability Analyzer - .NET | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/portability-analyzer
--Portability Analyzerを使ってライブラリの.NET Standard準拠を調べよう - ryuichi111stdの技術日記~
http://ryuichi111std.hatenablog.com/entry/2017/03/07/142248

-.NET Compatibility Diagnostic Tools
--NuGet Gallery | Microsoft.DotNet.FrameworkCompatibilityDiagnostics 0.5.0~
https://www.nuget.org/packages/Microsoft.DotNet.FrameworkCompatibilityDiagnostics/
--.NET Framework の互換性の診断 – Visual Studio 日本チーム Blog~
https://blogs.msdn.microsoft.com/visualstudio_jpn/2016/03/02/net-framework/
--.NET API アナライザー | Microsoft Docs~
https://docs.microsoft.com/ja-jp/dotnet/standard/analyzers/api-analyzer
--.NET Coreへの移植 | ++C++; // 未確認飛行 C ブログ~
http://ufcpp.net/blog/2016/2/porting-to-net-core/

***[[移行先>.NETのクロスプラットフォーム対応#e3670d04]]プロジェクトを準備する。 [#o36ad6ee]
不要なファイルを削除する。
-packages.config
-Properties\AssemblyInfo.cs

***Projectファイルを準備する。 [#e8f374c4]
-以下のようなProjectファイルを準備する。~
(既存のProjectファイルの中身を以下で置き換えればイイ)
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
   </PropertyGroup>
 </Project>

-[[.NET Standard]]では、配下のSourceファイルが自動で追加される。~
必要に応じて、ファイルやフォルダの除外設定を行う。~
※ netstandardやnetcoreでは、除外されるファイルやフォルダだけがProjectファイルに明記される。

***ProjectをVisual Studioから開く。 [#w8f1924b]
Projectファイルをダブルクリックするか、空のソリューションに追加する。

***Projectの初期設定を行う。 [#tb3a8fcc]
 <PropertyGroup>
   <TargetFramework>netstandard2.0</TargetFramework>
   <AssemblyName>XXXX</AssemblyName>
   <RootNamespace>YYYY</RootNamespace>
 </PropertyGroup>

**[[ポーティング移行>移行・マイグレーション#ue626a7c]] [#d3087e43]

***移行対象ファイルを選別する。 [#j19db7af]
-コンパイル・エラーをチェックしながら移行対象ファイルを選別する。
-クラス・メソッドの有/無については、[[以下の検索システム>#j6b71fa5]]を使用すると良い。

***必要に応じて、NuGetパッケージを追加する。 [#b63d5929]
-「参照無し」が発生したら、NuGetパッケージを確認しインストール。~
NuGetパッケージにnetstandardが含まれるかどうかを確認する。~
([[パッケージを解凍して、中を直接確認>NuGetパッケージの開発と公開#p66307ac]]してもイイ)

-以下のライブラリの移行先をNuGetパッケージから探す。
--[[System系ライブラリ>#s76bf31b]]
---[[System.Configuration.ConfigurationManager>#qcd853ca]]

--System.Data系ライブラリ~
[[ADO.NETデータプロバイダ]]
---System.Data.SqlClient
---System.Data.Odbc
---Npgsql
---MySql.Data

--[[ASP.NET Core系ライブラリ>#odebd8c3]]~
※ ココが比較的、大変。

--[[その他ライブラリ>#sec5fcfd]]
---log4net
---Json.NET

-参考
--.NET Core に移植する - Windows 互換機能パックの使用~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/windows-compat-pack

***必要に応じて、[[ポーティング移行>移行・マイグレーション#ue626a7c]]する。 [#k31bea09]
以下のPlatformやLibraryに依存していた処理を、削除するか、[[ポーティング移行>移行・マイグレーション#ue626a7c]]する。

-Windows
-net11 - net47 - netXX
-Microsoft.VisualBasic
-上記以外のNuGetパッケージ

*パッケージ・マネージャ [#w4347dc8]

**NuGet [#f51240e8]

***引き続き使用できる。 [#p7a93db3]
-[[.NET Standard]]、[[.NET Core]]でも、引き続きNuGetを使用できる。
-1つのNuGetパッケージには、.NET Framework以外に、~
[[.NET Standard]]、[[.NET Core]]のライブラリを同梱してパッケージ化できる。

***Dependencies [#ya618486]
[[.NET Standard]]、[[.NET Core]]開発に活用できるNuGetライブラリは、~
[[.NET Standard]]、[[.NET Core]] 側にだけ、Dependencies を持つ。

※ しかし、実際には、Dependenciesが正確に書かれていないケースも多く、~
 (「target="lib\netXXX」毎にDependenciesが異なるので当然と言えば当然)~
 実際にインストールして[[.NET Standard]]に対応しているかどうかを判断する。

*System系ライブラリ [#s76bf31b]

** *.config [#n8baa2a2]
***System.Configuration.ConfigurationManager [#qcd853ca]
-NuGetパッケージがあるが使えない(詳細不明)。
-なので、現時点では、[[Microsoft.Extensions.Configuration>#lc101ede]]を使用する。
** [[*.config>.NET Core config]] [#n8baa2a2]

***Microsoft.Extensions.Configuration [#lc101ede]
以下の情報を元にマイグレーションする必要がある。
**ADO.NET [#n6543893]

***型付きDataSet [#o6c225b0]
-(今の所、)型付きDataSetがない。
-参考
--microsoft.com
---ASP.NET Core の構成 | Microsoft Docs~
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/index
---Essential .NET - .NET Core における構成~
https://msdn.microsoft.com/ja-jp/magazine/mt632279.aspx
--stackoverflow.com
---ASP.NET Core configuration for .NET Core console application - Stack Overflow~
https://stackoverflow.com/questions/38114761/asp-net-core-configuration-for-net-core-console-application
---c# - How to SetBasePath in ConfigurationBuilder in Core 2.0 - Stack Overflow~
https://stackoverflow.com/questions/46843367/how-to-setbasepath-in-configurationbuilder-in-core-2-0
--Port xsd.exe to .NET Core · Issue #8647 · dotnet/corefx~
https://github.com/dotnet/corefx/issues/8647

***DatasetExtensions [#i9e17b1b]
LINQ to DataSetを使用できない。

-参考
--Port DatasetExtensions to .NET Core · Issue #19771 · dotnet/corefx~
https://github.com/dotnet/corefx/issues/19771

*その他ライブラリ [#sec5fcfd]

**log4net [#ga11dd74]
-一部、インターフェイスの変更があるもよう。
-引数にRepositoryが必要になったようだが、~
Microsoft.Extensions.Logging.ILoggerProviderの規則などには関係が無い模様。

***参考 [#y7d8880d]
-How to use Log4Net with ASP.NET Core for logging | dotnetthoughts~
https://dotnetthoughts.net/how-to-use-log4net-with-aspnetcore-for-logging/
-Essential .NET - .NET Core によるログ記録~
https://msdn.microsoft.com/ja-jp/magazine/mt694089.aspx

**その他 [#x3627e74]
-DotNetZip ---> ・・・
-System.Net.Mail ---> MailKit
-System.Drawing ---> ImageProcessor

*[[ASP.NET Core]]系ライブラリ [#odebd8c3]
-対応するライブラリが「Microsoft.AspNetCore.XXXX」にある可能性がある。
-これらのライブラリは[[ASP.NET Core]]ではなく、[[.NET Standard]]前提になる。~
https://www.nuget.org/packages/Microsoft.AspNetCore.All

**System.Web [#i5893ae7]
対応するライブラリが「Microsoft.AspNetCore.XXXX」にある可能性がある。

***RootPath [#paa63f57]
-HttpContext.Current.Request.ApplicationPath
-・・・

|#|内容|net|netcore, netstandard|h
|1|現在のアプリケーションのルート仮想パス(「/」や「/アプリ名」のような)。|HttpContext.Current.Request.ApplicationPath|HttpContext.Request.PathBase|
|2|サーバー アプリケーションのルート ディレクトリの物理ファイル システム パス|HttpRequest.PhysicalApplicationPath|IApplicationEnvironment.ApplicationBasePath|

-参考
--[[Webサイトのパスを取得する方法]]
--asp.net core - Access IApplicationEnvironment.ApplicationBasePath - Stack Overflow~
https://stackoverflow.com/questions/37298402/access-iapplicationenvironment-applicationbasepath
--Getting the Web Root Path and the Content Root Path in ASP.NET Core | Marius Schulz~
https://blog.mariusschulz.com/2016/05/22/getting-the-web-root-path-and-the-content-root-path-in-asp-net-core

***HttpContext [#yfe521c8]

-c# - How to get HttpContext.Current in ASP.NET Core? - Stack Overflow~
https://stackoverflow.com/questions/38571032/how-to-get-httpcontext-current-in-asp-net-core
-Accessing HttpContext outside of framework components in ASP.NET Core | StrathWeb. A free flowing web tech monologue.~
https://www.strathweb.com/2016/12/accessing-httpcontext-outside-of-framework-components-in-asp-net-core/

※ 上記の「Mimicking HttpContext.Current」で[[.NET Standard]]なライブラリ化も可能。

***[[Session>ASP.NET CoreのSession利用方法#x840cdc7]] [#bea9cfcb]

※ [[HttpContext>#yfe521c8]]経由でアクセスする。

***Cookie [#vcd28b71]
-ASP.NET Core Working With Cookie~
https://www.c-sharpcorner.com/article/asp-net-core-working-with-cookie/
-ASP.NET Core 2.0 MVC で Cookie を利用する - Qiita~
https://qiita.com/code0327/items/26c09c83103083ae57b7

***その他 [#q5729d43]
-System.Web.Routing.RouteTableが無い。
-System.Web.Routing.RouteTable ---> Microsoft.AspNetCore.Routing.RouteTable
-・・・

**Microsoft.Owin [#gce2c3f9]
対応するライブラリが「Microsoft.AspNetCore.XXXX」にある可能性がある。

***Base64Url [#b4a7094a]
-[[Microsoft.AspNetCore.WebUtilities>https://docs.microsoft.com/en-us/dotnet/api/index?view=aspnetcore-2.0&term=Microsoft.AspNetCore.WebUtilities]]

*[[ASP.NET Core]]系ミドルウェア [#cdb7c1c5]
**MVC [#w703d092]
-Microsoft.AspNetCore.Mvc

***Controllerクラス [#b59d2213]
-[[下記のFiltersの影響>#m32862a5]]により、一部メソッドにインターフェイスの変更はある。
**Filters [#fdf91fc4]
Microsoft.AspNetCore.Mvc.Filters

**WebAPI [#kde6f3a7]

***Filterクラス [#m32862a5]
Microsoft.AspNetCore.Mvc.Filters

-Filterパイプラインが再実装されて、分かりやすくシンプルになった。
-ASP.NET MVC 5 と同じように扱える抽象クラスが Core MVC でも用意されている。~
(ActionFilterAttribute, ResultFilterAttribute, ExceptionFilterAttribute)
-Resource Filterにより、キャッシュなどパフォーマンスの改善の実装が容易に。
-ただし、一部にインターフェイスの変更はある(フィルタ・メソッド、属性の引数)
-また、下記が追加された。
--非同期版のメソッドの追加。
--属性だけでなくDIとの連携した適用が可能になった。

***参考 [#g5a11005]
-Azure ServiceFabric - Asp.Net WebApiをCore化した時のメモ - Qiita~
https://qiita.com/Yossan/items/e2beb926c0bab31912be

-Filters
--フィルター | Microsoft Docs~
https://docs.microsoft.com/ja-jp/aspnet/core/mvc/controllers/filters
--ASP.NET Core - 実際の ASP.NET Core MVC フィルター~
https://msdn.microsoft.com/ja-jp/magazine/mt767699.aspx
--ASP.NET Core MVC で大きく変わったフィルタについて調べた - しばやん雑記~
http://blog.shibayan.jp/entry/20160727/1469596437
--アクションフィルタ - コントローラ詳細 - ASP.NET Core ClockUpTips~
http://aspnet-core.clock-up.jp/contents/controller/action-filter

**MVC [#w703d092]
Microsoft.AspNetCore.Mvc

***Controllerクラス [#b59d2213]
-[[上記のFiltersの影響>#fdf91fc4]]により、一部のメソッドにインターフェイスの変更がある。

**WebAPI [#kde6f3a7]

***Controllerクラス [#t3d533d0]
-ベースクラスが、[[MVC>#w703d092]]の[[Controller>#b59d2213]]と統合された。

-[[上記のFiltersの影響>#fdf91fc4]]により、一部のメソッドにインターフェイスの変更がある。

***Filter、FilterAttributeクラス [#u3864545]
-ASP.NET Core - 実際の ASP.NET Core MVC フィルター~
https://msdn.microsoft.com/ja-jp/magazine/mt767699.aspx
-Azure ServiceFabric - Asp.Net WebApiをCore化した時のメモ - Qiita~
https://qiita.com/Yossan/items/e2beb926c0bab31912be

*参考 [#p59f57c7]
[[.NET Standard]]は、[[.NET Core]]のサブセットなので、≒[[.NET Core]]。~
なので、以下のリンクは、[[.NET Coreへの移行]]の情報を含む。

**[[.NET Coreへの移行]] [#xd12992f]
**内部リンク [#e572057e]

**[[ASP.NET Coreへの移行]] [#ob21c056]
***[[.NET Coreへの移行]] [#xd12992f]

***[[ASP.NET Coreへの移行]] [#ob21c056]

***[[.NET Standardバージョンアップ>.NET Coreバージョンアップ#zfa0cd01]] [#m437b56e]

***[[マネージドコードとアンマネージドコードのブリッジ]] [#f3ac66a2]

**microsoft.com [#icd8ac95]

***Microsoft Docs [#ncb5387c]
-.NET Framework から .NET Core への移植~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/
--プロジェクトを整理し、.NET Framework と .NET Core をサポートする~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/project-structure
--.NET Core への移植 - サードパーティの依存関係を分析する~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/third-party-deps
--.NET Core への移植 - ライブラリ~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/libraries
--.NET Core に移植する - Windows 互換機能パックの使用~
https://docs.microsoft.com/ja-jp/dotnet/core/porting/windows-compat-pack

***MSDN magazine > Essential .NET [#y1a2850c]
-.NET Core における構成~
https://msdn.microsoft.com/ja-jp/magazine/mt632279.aspx
-.NET Core によるログ記録~
https://msdn.microsoft.com/ja-jp/magazine/mt694089.aspx
-.NET Core による依存関係の挿入~
https://msdn.microsoft.com/ja-jp/magazine/mt707534.aspx
-Visual Studio 2015 と .NET Core ツール~
https://msdn.microsoft.com/magazine/mt736459
-.NET Core 1.0 によるコマンドライン処理~
https://msdn.microsoft.com/magazine/mt763239

***.NET API Browser [#j6b71fa5]
https://docs.microsoft.com/en-us/dotnet/api/index

-.NET Standard API Reference~
https://docs.microsoft.com/en-us/dotnet/api/index?view=netstandard-2.0

**その他 [#h7cf5504]
-.NET Core 2.1のロードマップが公開されたようです - つばろぐ~
http://tsubalog.hatenablog.com/entry/net-core-2-1-roadmap

----
Tags: [[:.NET開発]], [[:.NET Core]], [[:.NET Standard]], [[:移行]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS