過去に作ったDLLが、C#でエラーが発生して使用できないとお悩みの(筆者と同じ)貴兄に、もしDLLの宣言が
となっている場合には、C#でimportする際に
int WINAPI DLL_Foo(...)
とすればよい、つhttp://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.callingconvention%28v=vs.110%29.aspx
[DllImport("(DLLファイル名).dll", CallingConvention = CallingConvention.Winapi)]
unsafe static extern void DLL_Foo(int DllIntVar1, int DllIntVar2, byte* pDllByteArray);
"Cdecl: 呼び出し元がスタックを消去します。 これを使用すると、varargs で関数を呼び出すことができます。Printf など、受け取るパラメーターの数が可変のメソッドで使用します。"
"StdCall: 呼び出し先がスタックを消去します。 これは、プラットフォーム呼び出しでアンマネージ関数を呼び出すための既定の規約です。"
"Winapi: このメンバーは実際には呼び出し規約ではありません。代わりに、既定のプラットフォーム呼び出し規約を使用します。 たとえば、Windows では StdCall、Windows CE .NET では Cdecl が既定値になります。"