最終更新日 2024-09-25

DllExport.bat ~C#のみで 秀丸マクロ用のDllを作成~

概要

DllExport.bat とは、C#の記述だけで、「C/C++のネイティブから使える.dll」を作ることができるようにするためのモノです。

具体的には下記のように「[DllExport]というアトリビュート」を付け加えるだけで、「C/C++のネイティブから使える.dll」になる、というモノです。

ClassLibrary36.cs
namespace ClassLibrary36
{
    public class Class1
    {
        [DllExport]
        public static IntPtr abc(IntPtr b)
        {
            return (IntPtr)3;
        }
    }
}

ここでは「C#」で作成した.dllを「DllExport.bat」を利用して秀丸から直接利用する方法を解説します。
読者の想定レベルとしては、

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

DllExport.batのメリットとデメリット

hm.NET DllExport
想定ターゲット 秀丸エディタ 32bit / 64bit
秀丸から利用することを想定したさまざまな支援の仕組みがある。
ネイティブおよび中間アセンブリ プログラム全般
秀丸には特化していないため、全て自分で構築する。
自作dllの対象プラットフォーム
.NET Framework 4.5 ~ 4.8
(実際には4.x全般)
.NET Framework 4.5 ~ 4.8
(実際にはもっと広範、しかし.NET Framework以外は利用メリットはなし。.NET Core 3.1は不正終了しやすい)
自作dllの対象CPU ANY CPU x86 もしくは x64 のうち1つを選択
使用技法 いずれもマイクロソフトが提供している「C++/CLI コンパイラ、C# コンパイラ、.netmodule」 マイクロソフトのコンパイラでは実現できない、かなりイレギュラーな方法
エラー表示 間にhm.NETが挟まっているため、わかりやすいエラーが出る。 秀丸からの関数の呼び出しまわりでエラーが起きると、ただ不正終了するだけとなってしまうなど、C#の恩恵が一部スポイルされる。
実行時の他の.dllへの依存 hm.NET.dllに依存、VC++ ランタイムに依存 特別な依存ファイルはなし。Windowsに最初から入っているもので実行可。

DllExportは、そのコンパイルに独特な技法を挟み込むため、将来長く使っていくプログラム、メンテナンスしていくようなプログラムに使うのことはおすすめしません。
しかしながら「DllExport.bat」による技法は、秀丸にととまらず、C/C++言語などネイティブのWin32(Win64)プログラムから読める.dllを、C#で作成できるため、
「C++はほとんど知らないが、C#ならそこそこわかるという人が、ネイティブから呼ばれるdllをいち早く作成できる」という点で一考の価値があるといえます。

動作環境

利用方法

[DllExport]を使った最初の dll

まずは以下のソースで試してみましょう。

ClassLibrary36.cs
using System;
using System.Diagnostics;

namespace ClassLibrary36
{
    public class Class1
    {
        [DllExport]
        public static int abc(int a, int b)
        {
            var sum = 10 + a + b;
            Trace.WriteLine(sum);
            return sum;
        }
    }
}
この段階ではまだコンパイルできません。

DllExport.bat をダウンロード

https://github.com/3F/DllExport/releases
より、「DllExport.bat」をダウンロードします。

以下のようにソリューションファイル(.sln)と同じディレクトリに配置します。

一応、ブロック解除(or 許可する)をチェックしましょう。

DllExport.bat を実行

DllExportを実行し、以下のように設定します。

全て設定したら「Apply」を押しましょう。

プロジェクトをコンパイル

Visual Studio にフォーカスを戻すと、ソリューションやプロジェクトの再読み込みが促されるので再読み込みしてください。

「Release」にしてビルドしてみましょう。

以下のように「Release」直下に「ClassLibrary36.dll」があり、
さらに x86 と x64 のそれぞれのディレクトリにも同名のファイルが出力されています。

「Release直下のdll」と「x86 x64」フォルダに出来ているdll の違いを次章で解説します。