「[[マイクロソフト系技術情報 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のクロスプラットフォーム対応#c59bc8d4]]」の、「[[.NET Standard]]」移行ノウハウをサマリする。~
-[[コチラ>.NET Standard#ie8e5050]]に書いた通り、PCLと比べて移行はし易い感じ。

*詳細 [#u9084419]

**準備 [#k7f8bf18]

***[[移行先>.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]
-コンパイル・エラーをチェックしながら移行対象ファイルを選別する。

-[[必要に応じて、NuGetパッケージを追加する。>#b63d5929]]

-依存していた処理を削除するか[[ポーティング移行>#k31bea09]]する。

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

***必要に応じて、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のクロスプラットフォーム対応#c59bc8d4]]」で追加したNuGetパッケージ。

--Public
    <PackageReference Include="log4net" Version="2.0.8" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.1" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.1" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.1" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
    <PackageReference Include="System.Data.Odbc" Version="4.5.0-preview1-26216-02" />
    <PackageReference Include="System.Data.SqlClient" Version="4.4.3" />
---DamPstGrS
 <PackageReference Include="Npgsql" Version="3.2.7" />
---DamMySQL
 <PackageReference Include="MySql.Data" Version="6.10.6" />

--Framework
    <PackageReference Include="Microsoft.AspNetCore.Http" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Http.Extensions" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.2" />
    <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.0.2" />
    <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />

***必要に応じて、[[ポーティング移行>移行・マイグレーション#ue626a7c]]する。 [#k31bea09]

以下は、下記の「[[移行元 / 移行先>.NETのクロスプラットフォーム対応#c59bc8d4]]」でポーティング移行した処理。

-Public~
あとでDiff分析してまとめる。

-Framework~
あとでDiff分析してまとめる。

*パッケージ・マネージャ [#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]]を使用する。

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

-参考
--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

*[[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」にある可能性がある。

***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 [#bea9cfcb]
文字列しか格納できなくなったので、複雑なオブジェクトはJSONに変換する。

-Using Sessions and HttpContext in ASP.NET 5 and MVC6~
https://benjii.me/2015/07/using-sessions-and-httpcontext-in-aspnet5-and-mvc6/
-ASP.NET Core MVCでSession管理 - 今日もちょいつか~
http://heinlein.hatenablog.com/entry/2017/11/21/141639

***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

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

-参考
--asp.net core - Access IApplicationEnvironment.ApplicationBasePath - Stack Overflow~
https://stackoverflow.com/questions/37298402/access-iapplicationenvironment-applicationbasepath

**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]]

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

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

-参考
--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

*サマリ [#o043b2e7]
既存ライブラリは、以下のような方針で移行できると考える(あくまで一例)。

-OpenTouryoProject/OpenTouryo > Issue #235~
&gt; Migrate to .NET Standard. > Result of verification~
https://github.com/OpenTouryoProject/OpenTouryo/issues/235#issuecomment-377419287

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

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

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

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

***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 [#j377c636]
https://docs.microsoft.com/en-us/dotnet/api/index?view=netstandard-2.0

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

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