[C#/.Net Core] .Net Core(3.1)でSystem.Drawingをクロスプラットフォームに利用する

System.Drawing.Commonパッケージ

System.Drawing名前空間には画像を扱う上で便利なものが含まれていますが、そのままだとドキュメントに見えるものの半分も利用できません。Windowsで開発していてもです・・・

これは.Net Frameworkから引き継いだもので、System.Drawing名前空間のものはWindowsのGDI+ APIに依存しているためWindows以外の環境で利用できません。.Net Coreはクロスプラットフォームがデフォルトなので、このような環境依存のものは利用できないのでしょう。でもドキュメントを眺めていると.Net Core 3.0から対応という記述が見られます。いや使えないじゃん・・・

これの正式な解決策かは知りませんが、NugetからSystem.Drawing.Commonパッケージを追加することでSystem.Drawing名前空間内のものを.Net Coreなプロジェクトにおいても利用可能になります(MS公式のものなので多分正解なはず・・・)。

www.nuget.org

これをインストールしておくことでWindowsではそのまま意図通りの動作を得られますし、シングルバイナリ出力しても問題ありません。しかし、Windows以外のプラットフォームへ持っていくとDllNotFoundExceptionが投げられることでしょう。結局Windows依存なのか・・・

libgdiplus

依存関係が無いなら依存関係を整えてやれば良いだけのこと。非Windowsにおける.Net実装であるMonoがSystem.Drawingの非Windows実装であるlibgdiplusというライブラリをリリースしています。

www.mono-project.com

これがあればWindows以外でもそのままのコードでSystem.Drawing名前空間のものをほぼ利用できます(100%実装してないと書かれているので、利用できないものもあるでしょう・・・)。

MacOS

$ brew install mono-libgdiplus

Linux

$ sudo apt-get update
$ sudo apt-get install libgdiplus

.NET COREでSYSTEM.DRAWINGを使う UBUNTU編より。

※私自身は、Linuxでの動作は未確認です。

参考文献

この記事のMarkdownソース