.NET Coreの自己完結型アプリからInteropServicesを参照する場合の注意点

.NET Core, Windows 10, Windowsサンドボックス

.NET Coreを用いた開発環境では、自己完結型アプリケーションという形式でアプリをビルドできる。

この自己完結型アプリというのは、ユーザーのPCがWindows 10でさえあれば、何も他の実行環境(.NET Frameworkのランタイムや.NET Coreのランタイムなど)が入っていなくてもexeファイルをたたくだけで実行できるという素晴らしいものなんだけど、

System.Runtime.InteropServices名前空間のクラスを呼び出すコードがある場合に自己完結型アプリをビルドするときには注意が必要、というお話。


通常、自己完結型アプリは同梱するDLLも含めると60MB以上もの大きなサイズになってしまう。

もちろん、その中には使われない無駄な機能がたっぷり含まれているので削れるところは削りたいと思うのが開発者。

.NET Coreのコンパイラには「トリミング機能」というそれっぽい機能があって、コンパイルオプションで-p:PublishTrimmedをtrueに設定するとサイズを削れるようだ。

筆者が試した環境では、オプションを指定しない場合には233MBものサイズになったのが、指定すると170MBに抑制された。

これでちょっぴり幸せになれたと思ったが、生成されたアプリを「Windowsサンドボックス」上でよくよく観察してみると、InteropServices名前空間を用いて実装した機能が軒並み動いていない。

まさかとねーと思いながら-p:PublishTrimmedオプションをfalseにしてもう一度コンパイルして試すと、今度は動いた。


結論:2020/5/2現在、少なくともInteropServicesの機能を利用している場合は、.NET Coreコンパイラのトリミング機能を使ってはならない。