読者です 読者をやめる 読者になる 読者になる

銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Chatwork.Api をnetstandard1.6とnet45対応しました

ChatWorkのAPIエンドポイントがv2に変わる対応を公開したのですが、同時に0.5では.NET Frameworkでは使えなかったので0.6.1で.NET Framework 4.5でも使えるようにしました。

www.nuget.org

紆余曲折あった.NET Coreのプロジェクトファイルですが、*.csprojになったおかげで最終的にはNuGetライブラリの設定もcsprojの中で定義することができるようになったのですっきりしました。また、Visual StudioからNuGetパッケージの作成もできるようになりました。

CSharp.Chatwork.Api/Chatwork.Service.csproj at v0.6.1 · tanaka-takayoshi/CSharp.Chatwork.Api · GitHub

さて、.NET Coreと.NET Frameworkの両方に対応する方法ですが、csproj内のTargetFrameworks要素に併記すればOKです。対象が1つのときはTargetFrameworkでもいいのですが、複数のときは複数形のTargetFrameworksです。

    <TargetFrameworks>netstandard1.6;net45</TargetFrameworks>

この辺の記載についてはこちらに記述があります。

docs.microsoft.com

ただ、これだけだと下記に報告されているように .NET Framework側のビルドでHttpClientクラスがみつからないエラーが出ます。

github.com

とりあえずのworkaroundとして.NET Frameworkのときだけ明示的にSystem.Net.Httpを追加すると動くようです。

  <!-- see https://github.com/dotnet/cli/issues/6033 -->
  <ItemGroup Condition=" '$(TargetFramework)' == 'net45' " Label=".NET 4.5 Package References">
    <Reference Include="System.Net.Http" />
  </ItemGroup>

さて、この複数のTargetFrameworkの指定、VisualStudio 2017 Preview (15.3)からデバッグ実行などが容易になったとRelease Notesに書かれています。

blogs.msdn.microsoft.com

なのですが、まだバグがあってTargetFrameworksを複数指定しているとNuGetのリストアが片方で実行されないようで、Issueを報告しておきました。

developercommunity.visualstudio.com

これのworkaroundとしては、直接dotnet restoreコマンドを実行するとリストアが正常に完了されました。NuGetパッケージの作成もdotnet pack -c Releaseで実行できます。