macOS dotnet MAUI Apple Script実行

dotnet MAUI AppleScript

Visual Studio for Mac Preview 17.3MAUIプロジェクトで Apple Scriptを実行する方法です。

新しいプロジェクトで、 .NET MAUI アプリプロジェクトを 作成後

新規プロジェクト
新規プロジェクト

メイン画面に テキストボックスとボタン追加

作成したプロジェクト内に「MainPage.xaml」があるので下記のように編集する。

テキストボックスと、 ボタンを追加
テキストボックスと、 ボタンを追加

「MainPage.xaml」のコードは下記を追加する。

<HorizontalStackLayout HorizontalOptions="Center">
<Entry
	x:Name="TextField1"                
	Text="" HorizontalOptions="Center" WidthRequest="200"/>
<Button Text="Execute Script" Clicked=""></Button>
</HorizontalStackLayout>

MAUIの場合、 テキストボックスは<Entry />です。

ボタンイベントを作成

「MainPage.xaml」作成したButtonのClicked=””の空部分で、 コントロール+スペースで「New Event Handler」を選ぶ

MAUI Button Event
Button Event

「MainPage.xaml.cs」C#コード側にボタンイベントが作成されました。

各プラットフォームに対応するコードを記述していく

プロジェクト内 Platformsは、 Android, iOS, MacCatalyst, Tizen, Windows フォルダがあり、

それぞれに対応するコードが書ける。

この5つのプラットフォームに ダミークラスを用意する。

TUtils.csを各プラットフォームに作成する
TUtils.csを各プラットフォームに作成する
public class TUtils : IUtils
{
	public string ScriptExecute(string text)
	{
		return "";
	}
}

MacCatalystフォルダ内のTUtils.cs↓だけ中身を書く

using System;
using Foundation;
public class TUtils : IUtils
{
	public string ScriptExecute(string text)
	{
		try
		{
			NSDictionary d1;
			var scrpt = new NSAppleScript(text);
			var exe = scrpt.ExecuteAndReturnError(out d1);
			if (d1 == null)
			{
				string s = exe.StringValue;
				return s;
			}
		}
		catch (Exception _e)
		{
			Console.WriteLine(_e.Message);
		}
		return "";
	}
}

MainPage.xaml近くに共通するIUtilsインターフェイスを作成する。

public interface IUtils
{
	public string ScriptExecute(string text);
}

MainPage.xamlのボタンから作成した関数ScriptExecute()を呼び出す。

先程作成したイベント MainPage.xaml.csのButton_Clicked()の中を、 下記に編集する。

void Button_Clicked(System.Object sender, System.EventArgs e)
{
	var u1 = new TUtils();
	TextField1.Text = u1.ScriptExecute("set value to \"Execute AppleScript.\"");
}

上記コードのScriptExecute()引数の文字列に、 簡単な文字を返すだけのAppleScriptコードを入れました。

macOSで実行するので、 「MacCatalyst フォルダ」にあるTUtilsクラスが呼ばれます。

実行画面

下↓のようにボタンを押すとAppleScriptが実行されました。

アプリ実行
アプリ実行

macOS .NET MAUI タイマーを使った時計表示

MAUIアプリ タイマーで時計表示

Visual Studio 17.3 Preview版 MAUIプロジェクトで Timerを使い XAMLのLabelに時計を表示する。

Visual Studio for 2022 Macは、下↓のURLからダウンロードできます。

https://visualstudio.microsoft.com/ja/vs/mac/

Preview版は、 現時点バージョン17.3で MAUIアプリの プロジェクトが作成できます。

新規プロジェクト作成 .NET MAUI アプリ
新規プロジェクト作成 .NET MAUI アプリ

メインの XAML画面で「タイマーを使った時計表示」

MAUIアプリプロジェクトを作成すると、デフォルトで下のアプリが実装されています。

初期実装されているアプリ

この画面の「Hello, World!」Label部分を時計表示に変えるコードです。

上記の画面は「MainPage.xaml」です。

下記は、「MainPage.xaml.cs」です。

コンストラクタにタイマーとイベントを追加しています。

public partial class MainPage : ContentPage
{
	int count = 0;

	public MainPage()
	{
		InitializeComponent();
        new Timer((state) =>
        {
            try
            {
                Dispatcher.Dispatch(() =>
                {
                    try
                    {
                        Label1.Text = DateTime.Now.ToString();
                        SemanticScreenReader.Announce(Label1.Text);//これいらん?
                    }
                    catch (Exception _e)
                    {
                        Console.WriteLine(_e.Message);
                    }
                });
            }
            catch (Exception _e1)
            {
                Console.WriteLine(_e1.Message);
            }
        }, null, new TimeSpan(0), new TimeSpan(0, 0, 1));
    }
}

TimerSystem.Threading.Timerです。

この、Timerイベントから 直接 Label1.Textの値を 変更すると ぶつかります。

イベント内の、Dispatcher.Dispatch()の 中で Label1.Textの値を変更しています。

C# dotnet 6.0 変数の型でswitchしたい場合

C# dotnet 6.0 変数の型でswitchしたい場合

C# dotnet 6.0 変数の型(type)で switchしたい場合のコード例です。

下記 2つの クラスをswitchで判断したい とします。

class A {}
class B {}

List<object>に 上記2つのA, Bクラス インスタンスを入れます。

var objList = new List<object> {
    new A(), new B()
};

1つのswitchで、型が2つ型変数の入ったリスト内の型を判断する

foreach(var obj in objList)
{
    switch (obj){
        case A aValue:
            Console.WriteLine("This type is {0}.",aValue.GetType().ToString());
            break;
        case B bValue:
            Console.WriteLine("This type is {0}.",bValue.GetType().ToString());
            break;
    }
}
C# それぞれの型でswitchできています
結果 型でswitchできています

上記の場合、 変数が switch(値)ですが switch(type) の コード例です。

var objList = new List<Type> {
    (new A()).GetType(), (new B()).GetType()
};
foreach(var obj in objList)
{
    switch (obj){
        case Type aValue when aValue == typeof(A):
            Console.WriteLine("This type is {0}.",aValue.ToString());
            break;
        case Type bValue when bValue == typeof(B):
            Console.WriteLine("This type is {0}.",bValue.ToString());
            break;
    }
}