Raspberry PiでWindows .NETのアプリケーションを動かす

Raspberry PiのCPU温度を取得してGUIに表示するWindows .NET FrameWorkアプリケーションを作成します。

monoをインストールする

Raspberry Piで.NETのWindowsアプリを実行するにはmonoをインストールする必要があります。
Shellから以下のコマンドを入力してください。

$ sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo “deb http://download.mono-project.com/repo/debian wheezy main” | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
$ sudo apt-get update; sudo apt-get upgrade -y
$ sudo apt-get install mono-complete

この辺のコマンドの詳細はmono Raspberryで調べるとたくさん出てきます。

Visual Studioでプロジェクトを作成する

Visual StudioでGUIのプロジェクトを作成します。プロジェクトの種類はWindowsフォームアプリケーション(.NET Framework)です。
Raspberry Pi側でmonoがWindows .NETアプリを解釈して実行するので、フォームアプリをそのまま作って問題ありません。

プロセス実行関数を作成します。
cmdはコマンド名、argsは引数です。

    public static string ExecAndRead(string cmd, params string[] args)
    {
        using (Process proc = new Process())
        {
            StringBuilder sb = new StringBuilder();
            foreach (string arg in args)
            {
                if (sb.Length > 0)
                {
                    sb.Append(' ');
                }
                sb.Append("\"" + arg + "\"");
            }
            proc.StartInfo = new ProcessStartInfo(cmd, sb.ToString());
            proc.StartInfo.RedirectStandardError = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = false;
            proc.Start();
            proc.WaitForExit();
            return proc.StandardOutput.ReadToEnd();
        }
    }

Raspberry PiでCPU温度を取得するコマンドはvcgencmd measure_tempです。これを500msごとに実行するワーカーを作ります。
取得した温度の情報は適当なテキストボックスにいれます。(事前にフォームを作っておきます。)

        void WorkerTemp()
        {
            while(true)
            {
                string cmd = "vcgencmd";
                List<string> args = new List<string>();
                args.Add("measure_temp");
                string CPUtemp = ExecAndRead(cmd, args.ToArray());

                Invoke((MethodInvoker)(() => {
                    textBox1.Text = CPUtemp;
                }));
                Thread.Sleep(500);
            }
        }

ワーカーをFrom関数上で実行します。

        public Form1()
        {
            InitializeComponent();

            Task.Run(() => WorkerTemp());
        }

あとはビルドして、出来たexeファイルをRaspberry Pi上に持っていき、実行すればOKです。