dotnet.exeで生成したwinformsプロジェクトのソースファイルをmonoでコンパイルできるよう考える。

C# コンピュータ
C#

monoでdotnet.exeで生成したプロジェクトを扱うのは筆者のスキルでは困難ですので、Form1.csのみをmonoのmscでコンパイルできるように試してみたいと思います。

まずプロジェクト用のフォルダを作成。フォルダ名をTestProject01としました。

そのフォルダでwinformsプロジェクトを作成します。

 dotnet new winforms -f net8.0

Form1.csを以下のように修正

using System;
using System.Windows.Forms;
using System.Drawing;

/*
ビルド
mcs ./Form1.cs /d:MONO /r:System.Windows.Forms.dll /r:System.Drawing.dll /out:TestProject01.exe

実行
mono TestProject01.exe
*/

namespace TestProject01
{

public partial class Form1 : Form
{
    public Form1()
    {
#if !MONO
        InitializeComponent();  // monoには存在しないので
#endif
    }
#if MONO
    // mono用のエントリーポイント
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }    
#endif
}

}

.NET環境(Windows11)で実行します。

 dotnet run

問題なく表示されます。

mono環境(Ubuntu)でコンパイルしてみます。

mcs ./Form1.cs /d:MONO /r:System.Windows.Forms.dll /r:System.Drawing.dll /out:TestProject01.exe

/d:MONOオプションでMONOというシンボルを定義します。
/out:プロジェクト名.exeオプションで出力ファイル名を指定します。
実行してみます。

mono TestProject01.exe

こちらも表示されました。

#ifをつかってMONOシンボルの有無でコードを適用するか分岐させています。

追記:20250212
Windows11(.Net)のWinFomrsとUbuntuのMono(.NetFramework)で同じソースコードで各々ビルドすることはできますが、GUIの見た目が異なります。
特に日本語フォントなどで文字列の一部が表示されない(後ろが切れる)など、おのおのの環境ごとに調整が必要となります。

.Netと.NetFrameworkの違いはそれほど感じませんが、マルチプラットフォームで動くアプリケーションの開発環境と考えるとちょっと面倒です。VSCodeで開発が出来るのし、C#の知識が使えるので良いとは思うのですが、別な開発環境を考えた方が良いかもしれません。

候補としてはQtとC++の組み合わせですが、C++は学習のハードルが高いので、QtとPythonの組み合わせでPySideあたりを考えています。

コメント