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

概要

秀丸マクロの createobject 用に .NET 5.x で.dllを作成する方法です。
(NET Core 3.1や.NET 6以降も同様)

常駐監視タイプではない、シンプルな .dllの場合、
この createobject 用の.dllを .NET 5で作成する方法も、かなり良い選択となります。

ただし、.NET Framework 4.xでの制作に比べると、.NET 5の手法は少し周辺の「.json」などの設定ファイルが多く必要となりますので、
.NET 5の必要性が全くなく、.NET Framework 4.xで良いのであれば、.NET 4.xでの作成をおすすめします。

ダウンロード

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

更新日 2022/03/05
NET5COMServer.zip

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

動作環境

  • 秀丸

    秀丸エディタ ver8.97以上

  • Visual Studio 2019 v16.8 以降

    .NET 5以降を扱う場合、Visual Studio 2019 v16.8以降が必要です。

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

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

PICTURE

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

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

namespace NET5COMServer
{
    [ComVisible(true)]
    [Guid("C144B4C1-27CB-401F-ABE8-55378564E18D")]
    public class NET5COMServer
    {
        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を流用しないようにしてください。

プロジェクトのCPUターゲットの設定

プロジェクトファイルの「****.csproj」ファイルを開き、以下のように設定しましょう。

「EnableComHosting」 をtrueに、
「PlatformTarget」を「x86」にする必要があります。

もしもあなたが「秀丸エディタ 64bit edition」を使っているならば、「PlatformTarget」は「x64」を選択してくださいです。

NET5COMServer.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <EnableComHosting>true</EnableComHosting>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>
 
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
    <DebugType>none</DebugType>
    <DebugSymbols>false</DebugSymbols>
  </PropertyGroup>
 
</Project>

GUI上で確認した場合には、以下のようになっていればOKです。
「EnableComHosting」については、GUI上で設定を編集や確認はできないので注意してください。

PICTURE

PICTURE

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

C#の「クラスに割当てたGUID」を以下のようにClsIDとして使って呼び出すこととなります。
C#のdllをコンパイルした際に、「comhost」と付いた.dllが作成されますので、そちらを呼ぶことになります。

*.dll、*.comhost.dll、*.jsonが動作に必要.NET Framework 4.x とは異なり、.NET5以降では、コンパイルした際に生成された各種の「.json」ファイルも動作に必要となります。
ファイルのコピーや移動の際に忘れがちですので注意しましょう。

NET5COMServer.mac
// Guidの部分は変更しているハズなので、その値へと差し替えること
#obj = createobject( currentmacrodirectory + @"\NET5COMServer.comhost.dll", "{C144B4C1-27CB-401F-ABE8-55378564E18D}");

$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内の関数が呼ばれるので意味がある