「hmLoadCLR」で既存の.NETのクラスを込みこむ

  • 概要

    ここでは、.NET Frameworkに最初から搭載されているdllを読み込む方法を記載しています。

  • スクリプト層

    hmLoadCLRの設計方針を考慮すると、スクリプト層でゴリゴリと記述することは避けるべきです。

    C#等で作成した.dll内で処理を済ませる方向性の方が、大抵は見通しが良くなるでしょう。
    hmLoadCLRでは、「.dllへと値を渡す」こと・「.dllから値をもらうこと」に特化した方が上手くいきます。

    しかし、このページでは、あえて「hmLoadCLR」の「スクリプト層」でゴリゴリと記述する例として紹介しています。

  • フォームの実装

    秀丸 v8.66ですので、マクロとwinform.luaを1つにするのが有力な選択肢となるでしょう。

    PublicKeyTokenの調べ方はネットで検索してください。

    #MNG = loaddll( hidemarudir + @"\hmLoadCLR.dll" );
    
    if ( !#MNG ) {
        message("hmLoadCLR.dllが導入されていません");
        endmacro;
    }
    
    #_ = dllfuncw(#MNG, "DoString", R"MNG(
    -- Load Forms
    clr.System.Reflection.Assembly:Load("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    
    local Forms = clr.System.Windows.Forms; -- create a local variable with a namespace
    local iClicked : int = 0;
    
    Forms.Application:EnableVisualStyles(); -- call a static method
    
    do (frm, cmd = Forms.Form(), Forms.Button()) -- create a from and button in a using block
        frm.Text = 'こんにちわ♬';
        cmd.Text = 'クリック';
        cmd.Left = 16;
        cmd.Top = 16;
        cmd.Click:add( -- 「add」はイベントハンドラ追加。「remove」だとイベントハンドラ削除
            function (sender, e) : void
              iClicked = iClicked + 1;
              Forms.MessageBox:Show(frm, clr.System.String:Format('Clicked {0:N0} times!', iClicked), 'Lua',
                                         Forms.MessageBoxButtons.OK, Forms.MessageBoxIcon.Information);
            end);
        frm.Controls:Add(cmd);
        Forms.Application:Run(frm);
    end;
    )MNG"
    );
    
    freedll( #MNG );
    

    実行イメージ