Try .NET Core

.NET Coreを動かした、試した記録を書き残します。

ASP.NET Coreに、手持ちのライブラリを参照させる(1)

永らく業界に身を置けば、多少なりと手持ちのコード資産があると思います。
私も、.NET Framework2.0からメンテしているライブラリがあります。
.NET Coreでは手持ち資産をどうやって使うのか、試してみます。


PCLのdll/プロジェクトを参照してみる

私の手持ちの中に、Xamarin用にPCL(Portable Class Library)化したものがありました。
ポータブルなライブラリーと銘打ってるんですが、試してみると...。
f:id:try_dot_net_core:20161209195612j:plain
ダメなんですね。

.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パッケージじゃないと参照させないよ、と。
おおぅ、そりゃ無いぜハニー。

では、プロジェクト参照だとどうでしょう?
これも、参照の追加操作は可能なんですが...
f:id:try_dot_net_core:20161209201909j:plain

実際に使おうとすると、読めてないんですね。
f:id:try_dot_net_core:20161209202622j:plain

やーこれは、NuGetパッケージを作らないと、ダメなのか...。


NuGetパッケージについて調べる

NuGetパッケージはXamarinで色々使わせて頂き、お世話になりました。
とはいえ、自分で作ったことはありませんので、作り方を調べます。

このあたりを起点に、パッケージの構造GUIツールの使い方を見て試行錯誤。
PCLのdllをパッケージ化し、読ませてみましたが...
f:id:try_dot_net_core:20161210113507j:plain

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プロジェクトのプロパティを開きますと...
f:id:try_dot_net_core:20161210123433j:plain
右下の青字下線でTarget .NET Platform Standardと。これか。



参照:
c# - How to create .NET Platform Standard project - Stack Overflow
プロジェクトを整理し、.NET Framework と .NET Core をサポートする

.NET Standardプロジェクトをビルドする

変換リンクをクリックし、注意喚起のメッセージボックスで「はい」を選ぶと。
f:id:try_dot_net_core:20161210130233j:plain
おお!ビルドターゲットが変わってます。

しかし、このままビルドすると...
f:id:try_dot_net_core:20161210130358j:plain
エラーもりだくさん!

しかしこれ、ほとんどが.NET標準ライブラリの参照不足エラーでした。
私のPCLの場合、Xamarin.Formsで広く使うことが目的でしたので、外部の依存ライブラリが無かったことが幸いしました。

早速、参照を追加してやります。
参照編集はASP.NET Coreプロジェクトと同様に、ファイル単位では出来ません。
「NuGetパッケージの管理」から、名前空間を指定して、お目当てのブツを頂きます。
f:id:try_dot_net_core:20161210131045j:plain

パッケージをインストールするたびに復元が走り、参照エラーが消えていきます。
全部消えたところで、ビルドすると... f:id:try_dot_net_core:20161210132652j:plain
とおりました!


.NET Standardプロジェクトを参照させてみる

さて、PCLよりもカバー範囲が広い、.NET Standardプロジェクトが出来ました。
これだと、プロジェクト参照は通るんでしょうか...?

ソリューションに.NET Standardプロジェクトを追加して、ASP.NET Coreプロジェクトから.NET Standardプロジェクトを参照するようにします。 f:id:try_dot_net_core:20161210134202j:plain

さて、参照プロジェクトは、読めてますかね?
f:id:try_dot_net_core:20161210134551j:plain
読んでくれました!


次は、NuGetパッケージを作ってみます。