ロードと実行の基本

概要

ここではhm.NETの基本的な使い方が段階的に説明しています。
読者の想定レベルとしては、

  • C#の入門相当の文法は知っている
  • C#でとても簡単な100行~200行程度のソースのフォームアプリケーションなら自力で制作出来る。
  • Visual Studio で C#で開発

といった程度のプログラミング力・開発環境を想定しています。

.NET Framework なので注意

繰り返しとなりますが、.NET Frameworkが対象となります。
Visual Studio 2019以降では、.NET Frameworkより.NETが優先的に出てきますが、
「.NET Core 3.1」や「.NET 5.0~.NET 8.0」は hm.NET の対象ではありません。

PICTURE

「.NET Core 3.1」や「.NET 5.0~.NET 8.0」は対象外 クロスプラットフォームとなる「.NET Core 3.1」や「.NET 5.0~.NET 8.0」は対象ではないので注意してください。
「.NET Core 3.1」や「.NET 5.0~.NET 8.0」で制作する場合、
NET5のCOMによる手法」及び、「Hm.NetCOM」の利用が適しています。

この際の、C#層の記述はhm.NETとそっくりなものとなります。

C#側のソース

C#側の最も簡単な関数定義の入り口となります。

  • public かつ static

    秀丸マクロから直接呼び出す関数は「publicかつstatic」である必要があります。

  • System.IntPtr (nintという型でも良い) もしくは System.String

    秀丸マクロから直接呼び出す関数は、引数や返り値が「IntPtr」もしくは「String」である必要があります。
    IntPtrなのは、秀丸マクロが「32bit版だと数値が32bit」「64bit版だと数値が64bit」だからです。
    C#9.0からは「32bit版だと数値が32bit」「64bit版だと数値が64bit」という目的のため専用の「nint」という型名も追加されました。
    (nintの詳細はIntPtr より便利な nint

今回の例では

  • HmTestClass01.dllというdll名。
  • HmTestClass01.Class1といクラス。
  • そこにいくつかのstaticでpublicなメソッドが定義されている。

という単純な例となります。

Visual Studio で作成。HmTestClass01.dllとしてコンパイルのこと
using System;

namespace HmTestClass01
{
    public class Class1
    {
        public static IntPtr func_ii_i(IntPtr a, IntPtr b)
        {
            Int64 c = (Int64)a * (Int64)b;
            return (IntPtr)(-c);
        }

        public static String func_ii_s(IntPtr a, IntPtr b)
        {
            return $"{a}{b}";
        }

        public static String func_is_s(IntPtr a, String b)
        {
            return b + a.ToString();
        }
    }
}

秀丸マクロ側のソース

最も簡単なhm.NETの使用例となります。

  • CallMethod

    CallMethodにより秀丸マクロからC#で作ったdll上のメソッドを呼び出すことが出来ます。
    (※便宜上「中間アセンブリのdll」といった意味を代弁するものとして「C#で作ったdll」という呼び方をします。
    実際にはC#である必要性はなく、VB.net、C++/CLI、F#で制作した中間アセンブリのdllも呼び出せます。)

  • dllのフルパス、名前空間+クラス名

    この当たりは説明の必要はないかと思います。
    dllのフルパス、そして「名前空間+クラス名」が指定されています。
    通常はdllは、呼び出し元のマクロ(下記の例ではtest01.mac)と同じフォルダに入れておきましょう。

  • 関数(メソッド)名と引数

    引数は0個~4個までなら好きに指定できます。

    引数の最大個数が4つまで、というのは少ないという印象を受けるかもしれません。
    しかし、現実問題として多くの引数を渡す必要性が無いのです。
    必要性がない理由としては、後の章にて説明されますが、簡単に触れておくと

    C#側から秀丸マクロ上の変数を直接読み取ることが出来るため、多数の引数として渡す必要性が低い

    ためです。

  • dllfuncw もしくは dllfuncstrw

    返り値が数値なら「dllfuncw」を、返り値文字列なら「dllfuncstrw」を利用します。

  • freedllは禁止

    hm.NETをfreedllしないで下さい。
    hm.NETは一度プロセスに呼び出した後は、
    該当の秀丸のプロセスが終了するまで解放されるべきではありません。

test01.macなどと適当に名前を付ける
#HMNET = loaddll( hidemarudir + @"\hm.NET.dll" );

if ( !#HMNET ) { message "hm.NET.dllが読み込めない"; }

#result1 = dllfuncw( #HMNET, "CallMethod", currentmacrodirectory + @"\HmTestClass01.dll", "HmTestClass01.Class1", "func_ii_i", 3, 5 );

message str(#result1);

$result2 = dllfuncstrw( #HMNET, "CallMethod", currentmacrodirectory + @"\HmTestClass01.dll", "HmTestClass01.Class1", "func_ii_s", 13, 15 );

message $result2;

$result3 = dllfuncstrw( #HMNET, "CallMethod", currentmacrodirectory + @"\HmTestClass01.dll", "HmTestClass01.Class1", "func_is_s", 3, "500" );

message $result3;

// freedll(#HMNET); と記述するのは駄目