Windowsで開発した .Net Coreを、frameworkがインストールされていないLinuxで実行

この記事で説明している事

この記事では、.NET Coreを利用し、コンソールアプリを作成して、Linux上で自己完結型の実行可能ファイルを実行しています。

.Net Coreはクロスプラットフォーム

クロスプラットフォームで実行する際に

1.自己完結型

2.フレームワーク依存型

の2つの形式があります。

自己完結型にすると、そのアプリに.NETランタイムが含められます。ユーザは、.NETフレームワークのインストールをすることなく実行が可能です。

クロスプラットフォームバイナリ作成

dllファイルの形式で、フレームワーク依存として発行すると、クロスプラットフォームバイナリが作成されます。

Linux上に filename.dllを置くと

dotnet <filename.dll> 

というコマンドで実行が可能でした。ただ、この方法だと、あらかじめLinux上にも対象のFrameWorkをインストールしておく必要があります。

自己完結型バイナリの作成

VisualStudio から、ビルドメニュー → 「アプリ名」の発効をクリック

開始ボタンをクリック

発行先としてフォルダを選択

ターゲットの場所の右端、「構成」ボタンをクリックします

配置モードを自己完結、ターゲットランタイムを linux-x64とします

発効します

発効にはしばらく時間がかかり、一つのフォルダに184個のファイルが出来上がりました。これは利用するdllなどでサイズが変わると思います。

アプリ配置と実行

出来上がったフィルをすべてLinux上にコピーします

/publish# chmod 755 ConsoleApp1

実行するとこんな感じです

/publish$ ./ConsoleApp1
Hello World!

単一アプリの作成

184個のファイルができるのもうっとおしいのですが、VisualStudio 2019 で作成すると、単一ファイルの作成が可能です。

とりあえずターゲットフレームワークも3.1にしてみました。

この状態で発行すると、すべて一つのファイルにまとまります。サイズは76MB程度になりました。

~$ chmod 755 ConsoleApp1

一つのファイルだけでも実行できました。

~$ ./ConsoleApp1
Hello World!

この実行方法は、自己完結型のクロスプラットフォームバイナリという位置づけで、予めLinuxに.NET Coreをインストールしておく必要がありません。

詳しくは、こちらからhttps://techlive.tokyo/archives/10101/embed

まとめ

自己完結型の実行ファイルは、ファイルサイズが大きくなりますが、そのファイルを置くだけで実行が可能になります。

ロリポップでは実行不可

さすがに普通のWordPressなどが利用できるようになっているレンタルサーバでは実行できませんでした。ロリポップのエンタープライズプランを利用しています。

$ ./ConsoleApp1
Failed to resolve full path of the current executable [/proc/self/exe]