MENU

Linux Ubuntu 環境で C# と Mono Framework を使用してウィンドウを表示する方法について説明します。

Linux Ubuntu 環境で C# と Mono Framework を使用してウィンドウを表示する方法について説明します。

目次

Linux Ubuntu C# Mono Frameworkでウィンドウを表示する

必要なパッケージのインストール

まず、Mono Framework と GUI ライブラリである System.Windows.Forms を使用するために必要なパッケージをインストールします。以下のコマンドをターミナルで実行します。

Bash

sudo apt update
sudo apt install mono-complete libgtk2.0-dev
  • mono-complete: Mono Framework のコンパイラやランタイムなど、開発に必要なパッケージをまとめてインストールします。
  • libgtk2.0-dev: System.Windows.Forms が内部で使用する GTK+ 2.0 の開発用ライブラリです。

C# コードの作成

次に、ウィンドウを表示する C# コードを作成します。テキストエディタで以下のコードを Window.cs という名前で保存します。

C#

using System;
using System.Windows.Forms;

public class Window : Form
{
    public Window()
    {
        Text = "Hello, Mono!";
        Width = 300;
        Height = 200;
    }

    public static void Main()
    {
        Application.Run(new Window());
    }
}
  • System.Windows.Forms 名前空間を using ディレクティブでインポートします。
  • Window クラスは Form クラスを継承し、ウィンドウのタイトル、幅、高さを設定します。
  • Main メソッドで Application.Run を呼び出し、ウィンドウを表示します。

C# コードのコンパイル

作成した C# コードをコンパイルします。以下のコマンドをターミナルで実行します。

Bash

mcs -pkg:gtk-sharp-3.0 -out:Window.exe Window.cs
  • mcs: Mono C# コンパイラです。
  • -pkg:dotnet: System.Windows.Forms を含む .NET アセンブリを参照するためのオプションです。

コンパイルが成功すると、Window.exe という実行ファイルが生成されます。

ウィンドウの実行

以下のコマンドをターミナルで実行し、ウィンドウを表示します。

Bash

mono Window.exe

実行サンプル

サンプルプログラム frame.cs

// コンパイル mcs -pkg:gtk-sharp-3.0 -out:frame.exe frame.cs
// AOT コンパイル mono --aot Program.exe
// 実行 ./frame.exe

using System;
using Gtk;

class GtkLoginApp : Gtk.Window
{
    Entry t1, t2;
    Button b1;
    Label l1;

    public GtkLoginApp() : base("LOGIN FRAME")
    {
        SetDefaultSize(650, 400);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };

        Box vbox = new Box(Orientation.Vertical, 10);
        Add(vbox);

        // CSS適用
        CssProvider cssProvider = new CssProvider();
        cssProvider.LoadFromData(@"
            label.title {
                font-size: 38px;
                font-weight: bold;
                color: white;
            }
            label.result {
                font-size: 24px;
                font-weight: bold;
            }
            .title-box {
                background-color: blue;
                padding: 10px;
            }
        ");
        StyleContext.AddProviderForScreen(Gdk.Screen.Default, cssProvider, uint.MaxValue);

        // Title Panel
        Label titleLabel = new Label("GTK# Sample");
        titleLabel.StyleContext.AddClass("title");

        EventBox titleBox = new EventBox();
        titleBox.StyleContext.AddClass("title-box");
        titleBox.Add(titleLabel);
        vbox.PackStart(titleBox, false, false, 10);

        // Main Panel
        Fixed mainPanel = new Fixed();
        vbox.PackStart(mainPanel, true, true, 10);

        t1 = new Entry { WidthRequest = 300 };
        t1.Changed += OnT1Changed;
        mainPanel.Put(t1, 50, 30);

        t2 = new Entry { WidthRequest = 300 };
        t2.Changed += OnT2Changed;
        mainPanel.Put(t2, 50, 70);

        b1 = new Button("Button") { WidthRequest = 80, HeightRequest = 40 };
        b1.Clicked += OnButtonClicked;
        mainPanel.Put(b1, 400, 70);

        l1 = new Label("Label1");
        l1.StyleContext.AddClass("result");
        mainPanel.Put(l1, 50, 110);
    }

    // `object? sender` → `object sender` に修正
    void OnButtonClicked(object sender, EventArgs e)
    {
        l1.Text = "ボタンが押された";
        Console.WriteLine("Button clicked!");
    }

    void OnT1Changed(object sender, EventArgs e)
    {
        l1.Text = t1.Text;
        Console.WriteLine("Text changed: " + t1.Text);
    }

    void OnT2Changed(object sender, EventArgs e)
    {
        l1.Text = t2.Text;
        Console.WriteLine("Text changed: " + t2.Text);
    }

    public static void Main()
    {
        Application.Init();
        new GtkLoginApp().ShowAll();
        Application.Run();
    }
}

コンパイル

mcs -pkg:gtk-sharp-3.0 -out:frame.exe frame.cs

実行

./frame.exe

補足

  • System.Windows.Forms はクロスプラットフォーム対応ではないため、Windows 以外の環境では外観や動作が異なる場合があります。
  • よりモダンな GUI ツールキットとして、クロスプラットフォーム対応の Avalonia や GTK# なども利用できます。

参考資料

よかったらシェアしてね!
目次