コンソールアプリを.NET Framework 4.5とNETCore2.1に両対応させつつ、GlobalTool化してみた

「.NET core グローバル ツール」っていうのを使うと、簡単にコンソールアプリを配布&インストールできるんだってー「マジで?!」 ということでEmptyKeysUI_Generatorの中のekUiGenを.NET Framework 4.5とNETCore2.1に両対応させて、NETCore2.1のほうをGlobalToolパッケージ化しました。

  1. イケル気がする(気のせい)
    最初は、ekUiGen.csprojの中のTargetFrameworkタグをTargetFrameworksにしてnetcoreapp2.1を追加すればイケルなと思っていたのですが、うまくいきませんでした。 「PackAsToolはNETCore2.1以降じゃねえとだめだゴルァ!」(意訳)とのこと。GlobalToolはNETCore2.1だけでいいのよ、NET4.5は普通のコンソールアプリにしたいの。誰か過去にやってないのかしら?とググってみたところ、.NET Core Global Tools Configuration | JvRというサイトを発見しました。

  2. やったか?(やってない)
    先人の知恵に従い、csprojを変更。ビルド後イベントに dotnet pack /p:GlobalTool=true -c Release を入れてみたが、失敗。 ビルドしてから、dotnet pack /p:GlobalTool=true -c Releaseを実行したところ、無事GlobalToolができました。めでたしめでたし。

  3. 実行できねえ(地獄への入り口)
    さっそくできたnupkgをインストールだぜヒャッハー!! インストール方法はここを参照 実行してみたらこんなエラーが

    A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet'.

    何じゃあこりゃああああ

  4. .NetCoreアプリとしてもダメ
    ググってみたものの、なかなか対処法がわからない。しかし、「それ、.NetCoreアプリとして動くの?」(意訳)という一文に従ってみると、

    A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in '(ユーザーフォルダが含まれているので省略)'. Failed to run as a self-contained app. If this should be a framework-dependent app, add the (省略)\ekuigen.runtimeconfig.json file specifying the appropriate framework.

    あかんやん

  5. よくわからんけど動いた
    プロジェクトファイル(*.csproj)に

<PropertyGroup>
    <OutputType>Exe</OutputType>
</PropertyGroup>

を入れたところ動いた。どこからこの一文を持ってきたんだ私。

この格闘の末のプロジェクトがこちら github.com そのうち本家にプルリクエスト投げる予定