以下の 2 つの空の関数を含む DLL ファイルを作成しました。
extern "C" __declspec(dllexport) void __stdcall myFunc1() {
// just empty function
}
extern "C" __declspec(dllexport) void __cdecl myFunc2() {
// just empty function
}
C# では、DLLImport
以下のように属性を使用して関数を呼び出すことができました。
[DllImport("myDLL", CallingConvention=CallingConvention.StdCall)]
private extern static void myFunc1();
[DllImport("myDLL", CallingConvention=CallingConvention.Cdecl)]
private extern static void myFunc2();
そのため、属性LoadLibrary()
の代わりにkernel32.dllを直接使用して再試行しました。DllImport
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void MyFunc1();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void MyFunc2();
ただし、 MyFunc2()が機能する場所で MyFunc1( ) を呼び出すと、ランタイム エラーが発生します。
そこで、C++ で置き換え__stdcall
、__cdecl
DLL を再コンパイルしてから、C# で MyFunc1() を再度呼び出しました。
そして..うまくいきました。
いったいなぜ __stdcall 呼び出し規約が C# の pinvoke で機能しないのですか?