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」を利用して秀丸から直接利用する方法を解説します。
読者の想定レベルとしては、

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

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

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をいち早く作成できる」という点で一考の価値があるといえます。

動作環境

  • 秀丸

    秀丸エディタ ver8.73以上

    もっと古いバージョンでも動作はするが... 実際にはもっと古い秀丸エディタ ver7.11といったようなバージョンでも動作しますが、サンプル中ではC#でのdllにとって重要な位置づけとなる「後片付けをするための関数呼び出し」についても記載しているため、 v8.66以上としています。

  • Visual Studio 2015 以降

    Visual Studio 2019 v16.8以降 を推奨

利用方法

  • まずは、C#でdllを作る

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

    PICTURE

[DllExport]を使った最初の dll

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

PICTURE

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)と同じディレクトリに配置します。

PICTURE

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

PICTURE

DllExport.bat を実行

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

  • Installed にチェック

  • x86+x64にチェック

  • Namespace for DllExport

    「Namespace for DllExport」には[DllExport]という記述があるnamespace名を記載します。
    プロジェクトの名前ではなく、[DllExport]という記述があるクラスを囲むnamespace名です。

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

PICTURE

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

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

PICTURE

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

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

PICTURE

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