秀丸マクロの createobject 用の.NET4.xのdll作成方法

概要

秀丸マクロの createobject 用に .NET Framework 4.x で.dllを作成する方法です。

常駐監視タイプではない、シンプルな .dllの場合、
この createobject 用の.dllを .NET Framework で作成する方法が、おそらくベストチョイスとなります。

dll側の引数の受け取り方、値の返し方の自然さ、秀丸マクロ側の記述の自然さの両者のバランスが一番良い形で取れています。

ダウンロード

下記のファイルは、以降の解説記事の内容のソリューションとなります。

更新日 2021/03/18
NET4COMServer.zip

NET4COMServer.zip を右クリックでプロパティで、「許可する(もしくはブロック解除する)」を適用してください。

動作環境

  • 秀丸

    秀丸エディタ ver8.96以上

  • Visual Studio 2013 以降

    Visual Studio 2019以降を推奨

C#のソース、必要なGuid設定

VisualStudioにて「新しいプロジェクトの作成...」→「Visual C#」→「クラス ライブラリ (.NET Framework)」を選択し、

PICTURE

NET4COMServer というプロジェクトにしたとしましょう。
「hm.NET」や「DllExport.bat」による手法とは異なり、メソッドにstatic を付けてしまうと秀丸から呼び出せなくなるので注意してください。
(COMはC#のstaticメソッドをサポートしていない)

static なメソッドは秀丸マクロのcreateobject/member経由からは呼び出せなくなるので注意!
NET4COMServer.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace NET4COMServer
{
    [Guid("BD55F2A6-9ED0-4F4F-9D37-E6B84BE63272")]
    public class NET4COMServer
    {
        public string str_add(string a, string b)
        {
            return a + b;
        }

        public int int_add(int a, int b)
        {
            return a + b;
        }
    }
}

クラスへのGuid設定

Visual Studio のメニューより「ツール」→「Guidの作成」

PICTURE

このように新たなGUIDを作成して、classの1つ上の行へと貼り付けましょう。
秀丸マクロ側から直接名指しで呼び出したいクラス1つに対して1つの新たなGuidが必要です。
別のクラスにすでに割り当てているGuidを流用しないようにしてください。

dllへのGuid設定

プロジェクトのプロパティを開き、「アセンブリ情報」内の「アセンブリをCOM参照可能にする」にチェックを入れます。

PICTURE

「AssemblyInfo.cs」のソースが以下のように変化したことを確認しましょう。

別のdllにすでに割り当てているGuidをコピペで流用しないようにしてください。

PICTURE

秀丸マクロからの呼び出し

NET4COMServer.mac
#obj = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");

$str_add = member(#obj, "str_add", "あいう", "かきく");
message($str_add);

#int_add = member(#obj, "int_add", 10, 20);
message(str(#int_add));

releaseobject(#obj); // dllは解放されないが、dll内の関数が呼ばれるので意味がある