ASP.NET Coreに、手持ちのライブラリを参照させる(1)
永らく業界に身を置けば、多少なりと手持ちのコード資産があると思います。
私も、.NET Framework2.0からメンテしているライブラリがあります。
.NET Coreでは手持ち資産をどうやって使うのか、試してみます。
PCLのdll/プロジェクトを参照してみる
私の手持ちの中に、Xamarin用にPCL(Portable Class Library)化したものがありました。
ポータブルなライブラリーと銘打ってるんですが、試してみると...。
ダメなんですね。
.NET Core projects only support referencing .NET framework assemblies in this release. To reference other assemblies, they need to be included in a NuGet package and reference that package.
んー、.NET Core標準でないヤツは、NuGetパッケージじゃないと参照させないよ、と。
おおぅ、そりゃ無いぜハニー。
では、プロジェクト参照だとどうでしょう?
これも、参照の追加操作は可能なんですが...
実際に使おうとすると、読めてないんですね。
やーこれは、NuGetパッケージを作らないと、ダメなのか...。
NuGetパッケージについて調べる
NuGetパッケージはXamarinで色々使わせて頂き、お世話になりました。
とはいえ、自分で作ったことはありませんので、作り方を調べます。
このあたりを起点に、パッケージの構造やGUIツールの使い方を見て試行錯誤。
PCLのdllをパッケージ化し、読ませてみましたが...
Errors in C:\Users\XXXXXX\Documents\Visual Studio 2015\Projects\dotnet_sample\src\WebApplication1\WebApplication1.xproj Package Xb.Core 1.0.0 is not compatible with netcoreapp1.1 (.NETCoreApp,Version=v1.1). Package Xb.Core 1.0.0 supports: net (.NETFramework,Version=v0.0) One or more packages are incompatible with .NETCoreApp,Version=v1.1.
incompatible with .NETCoreApp,Version=v1.1.
ですか...。
PCLとしてビルドしているのが、そもそもNGのようです。
すると、利用できるパッケージのビルドターゲットって、何になってるんでしょう?
Xamarinでお世話になったJson.NET
は、ASP.NET Coreでも使えました。
パッケージをバラして、中身を見てみます。
パッケージファイルnewtonsoft.json.9.0.1.nupkg
をダウンロードして解凍します。
NuGetパッケージはファイル一式をzipしたものなので、アーカイバで解凍できます。
パッケージの定義XMLNewtonsoft.Json.nuspec
を紐解きますと...
<?xml version="1.0" encoding="utf-8"?> <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> <metadata> <id>Newtonsoft.Json</id> <version>9.0.1</version> <title>Json.NET</title> <authors>James Newton-King</authors> <owners>James Newton-King</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <licenseUrl>https://raw.github.com/JamesNK/Newtonsoft.Json/master/LICENSE.md</licenseUrl> <projectUrl>http://www.newtonsoft.com/json</projectUrl> <iconUrl>http://www.newtonsoft.com/content/images/nugeticon.png</iconUrl> <description>Json.NET is a popular high-performance JSON framework for .NET</description> <language>en-US</language> <tags>json</tags> <dependencies> <group targetFramework=".NETFramework4.5" /> <group targetFramework=".NETFramework4.0" /> <group targetFramework=".NETFramework3.5" /> <group targetFramework=".NETFramework2.0" /> <group targetFramework=".NETPortable4.5-Profile259" /> <group targetFramework=".NETPortable4.0-Profile328" /> <group targetFramework=".NETStandard1.0"> <dependency id="Microsoft.CSharp" version="4.0.1" /> --- 中略 --- <dependency id="System.Xml.XDocument" version="4.0.11" /> </group> </dependencies> </metadata> </package>
んー?.NETStandard1.0
ってナンデスカソレ?
あやしい!
参考:
Nugetの使い方とパッケージの作り方 - Qiita
プライベートなnugetパッケージを作る - Qiita
VS100 - 032 NuGet パッケージ の作成と配布 - YouTube
NuGet Gallery | Json.NET 9.0.1
.NET Standardについて調べる
さてコイツ、何者なんでしょう?
公式ドキュメントが日本語なので、ありがたく目を通します。
次世代のPCL、ですって。
PCLはMicrosoftプラットフォーム縛り、.NET Standardはプラットフォームフリーとな。
やはり、コレでビルドするのがいいみたいですね。
さてしかし。
Visual Studioのプロジェクトテンプレートには、.NET Standard が見当たりません。
どうやって作るのよ?
はい、ぐぐりました。
これなんか、モロですね。
内容はこちらと同じで、要はPCLプロジェクトを作って変換しろ、とのことです。
ドキュメントでは、変換用のリンクをクリックする、とあります。
そんなんあったけなぁ?と、PCLプロジェクトのプロパティを開きますと...
右下の青字下線でTarget .NET Platform Standard
と。これか。
参照:
c# - How to create .NET Platform Standard project - Stack Overflow
プロジェクトを整理し、.NET Framework と .NET Core をサポートする
.NET Standardプロジェクトをビルドする
変換リンクをクリックし、注意喚起のメッセージボックスで「はい」を選ぶと。
おお!ビルドターゲットが変わってます。
しかし、このままビルドすると...
エラーもりだくさん!
しかしこれ、ほとんどが.NET標準ライブラリの参照不足エラーでした。
私のPCLの場合、Xamarin.Formsで広く使うことが目的でしたので、外部の依存ライブラリが無かったことが幸いしました。
早速、参照を追加してやります。
参照編集はASP.NET Coreプロジェクトと同様に、ファイル単位では出来ません。
「NuGetパッケージの管理」から、名前空間を指定して、お目当てのブツを頂きます。
パッケージをインストールするたびに復元が走り、参照エラーが消えていきます。
全部消えたところで、ビルドすると...
とおりました!
.NET Standardプロジェクトを参照させてみる
さて、PCLよりもカバー範囲が広い、.NET Standardプロジェクトが出来ました。
これだと、プロジェクト参照は通るんでしょうか...?
ソリューションに.NET Standardプロジェクトを追加して、ASP.NET Coreプロジェクトから.NET Standardプロジェクトを参照するようにします。
さて、参照プロジェクトは、読めてますかね?
読んでくれました!