最終更新日 2024-09-25

[DllExport]のメソッドから別の[DllExport]メソッドが呼ばれているとエラー

概要

次の例のように[DllExport] アトリビュートが付いたメソッドから、別の[DllExport] アトリビュート属性が付いたメソッドを呼び出すと実行時にエラーとなります。
原則的に[DllExport] アトリビュート属性が付いたメソッドは C#から呼び出さないようにしてください。

数値系の基本的な関数の書き方

ClassLibrary36.cs
using System;
using System.Runtime.InteropServices;

namespace ClassLibrary36
{
    public class Class1
    {
        [DllExport]
        public static IntPtr abc(IntPtr a, IntPtr b)
        {
            int c = (int)a + (int)b;
            return (IntPtr)(10 + c);
        }

        [DllExport]
        public static IntPtr ddd(IntPtr a, IntPtr b)
        {
            // DllExportの関数を呼んでると実行時にエラーとなる。
            IntPtr d = abc(a, b);
            return (IntPtr)(10 + (int)d);
        }

    }
}

呼び出し側

実行すると不正終了するはずです。

ClassLibrary36.mac
#DLL = loaddll( currentmacrodirectory + @"\ClassLibrary36.dll");

#ret = dllfuncw( #DLL, "ddd", 1, 2);
message(str(#ret));