· 

WSLでGUIアプリ作成(monodevelop)(2)

 

monodevelopでなんか作ってみる。どういうのを作るか、、、。Cで作ったダイナミックリンクライブラリをmono(すなわちC#)から呼び出すってのをやってみる。やっぱ例題としてはちょっとでも実用的なのをってことで。WSL内にあってmonodevelopで作ったアプリからwindowsのdllを直で呼び出すことはできない。何か手はないか、、、は後で考えるとして、とりあえずdllのほうをLinuxタイプのsoとして作成する。突然soファイル作成を復習したのはまぁそういう流れだったわけです。

シェル画面で
monodevelop &
(&はバックグラウンドジョブとして起動するってことなんだけど、GUIアプリを起動するときに&がないとGUIを閉じるまでそのシェルが使えなくなるので、その回避のためです)

File-->New Solutionを押す。

出てきたダイアログで、.NETを選んで、GTK#2.0 Projectを選ぶ。ここで開発言語も指定できるけど、まぁC#で。

プロジェクト名と場所を入力。いつも通りstudy1(2,3,...があるのか、いつもナゾ)。右側にプロジェクトのフォルダ構成が出るのがとても素晴らしい!

こうなる。

MainWindow.csをデザイナーで開く。

デザイナーで開きんしゃいって言っているのにソースコードエディタで開いちゃうことが多い。こういう時は下の"Designer"タブを押す。

WindowsのGUIアプリでは通常fixed layoutなので、かぶれもんとしてはfixed layoutにしたい。Toolboxにあるんだけど、Widgetsが邪魔なので小さくなってもらう。

こいつをずりずりっとやってMainWindowに落とす。

Windowの雰囲気が変わって、fixed1がアクティブになっていることが表示される。

で、fixed1の上にじゃんじゃんWidgetを落としていく。今回はテキストを入力できるあれ(Entryというらしい)

を3つとボタン1つ。ずりずりぼっとんで。
こうなる。

まぁこれでもいいんだけど、ちょっと気持ち悪い。

X,Yに数字を入力することで、いい感じの場所に移動させます。
entry1.x=20, entry1.y=20, 
entry2.x=20, entry2.y=60, 
button1.x=60, button1.y=100, 
entry3.x=20, entry3.y=140
ってすると、こうなる。

まぁすぐ気づくことだけど、

ここで、ボタンに表示されるラベルを変更できる。まぁどうでもいいのでそのままいく。

で、ボタンを押したときに動作させるので、ボタンを押したときのイベントのハンドラを実装するんやけど、そのハンドラを生成さす。

クリックイベントで動作さすので、Clickedをダブルクリックする("Click here to add ..."って書いてあるけど、違う、そうじゃない)。

ソースコードを見ると、書いてくれてます。

で、ここにコードを書いていく。

MainWindow.cs

using System;
using System.Runtime.InteropServices;//added to enable dllimport
using Gtk;

public partial class MainWindow : Gtk.Window
{
    [DllImport("./study1.so", EntryPoint = "keisan")]//added dll import
    public static extern uint keisan(uint a, uint b);//added function declaretion

    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        Build();
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        Application.Quit();
        a.RetVal = true;
    }

    protected void OnButton1Clicked(object sender, EventArgs e)
    {
        //add actual behavior from here
        uint a, b, c;
        a = uint.Parse(entry1.Text);
        b = uint.Parse(entry2.Text);
        c = keisan(a, b);
        entry3.Text = c.ToString();
        //actual behavior to here
    }
}

こうなる。

ここでキーボードからCtrl+Shift+Sを押して全保存しておく。で、一旦ビルドする。

こちらに、成功したってことが地味に出ている。

DLLを実行ファイルのあるフォルダにコピーする。Windowsのdotnetだとプロジェクトファイルのある場所に置けばよかったけど、monoではそうじゃないらしい。 ここにいる。、、、深い。桜通線より深い。

ここに、前回(https://sunday-engineer.blogspot.com/2023/12/wsllinuxdll.html)作成したstudy1.soをコピペしておく。
で、実行。

とうぜん、こういうのが出る。

そして、ちゃんと動く!

さて、こんなイケてるWSLも弱点がある。ハードウェア。USBを認識させるのがしんどいってのと、WindowがWindowsと別途動いている(何言ってるかわからんよね、、、)ので、相互にWindowを制御することはできない。USBは克服方法の記事がMicrosoftにあるのでいつかやってみる。GUIで日本語入力ができないってのもあった。これも解決方法はとうぜんあるので、いつかやってみる。


今年も終わりですねー。
今年よく耳にするようになったSDVについて、夢のようなことがあちこちで語られているけど、Sをはるかに超越した高性能のHがあってこそ成り立つのであって、つまりSよりもHが先んじないといけない。PCやスマホだってどんなに役に立つソフトを作ったとしてもハードウェアがそれに耐えられないと実用的ではない。SDRは超高性能な無線ハードウェアと超高速な演算装置ができたから広く利用されるようになった。そもそもHが優秀じゃないとSをテストできない。、、、いや、ちょっと考えればそんなことわかるよな。夢を語る人がどこまで具体的に考えているのか。