私は、C ++機能がC#からP/Invokedであるかなり大きなコードベースに取り組んでいます。
コードベースには、次のような多くの呼び出しがあります...
C ++:
extern "C" int __stdcall InvokedFunction(int);
対応するC#を使用する場合:
[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern int InvokedFunction(IntPtr intArg);
この明らかな不一致が存在する理由についての推論のために、私はネット(私ができる限りではない)を精査しました。たとえば、C#内にCdeclがあり、C++内に__stdcallがあるのはなぜですか。どうやら、これによりスタックが2回クリアされるようになりますが、どちらの場合も、変数は同じ逆の順序でスタックにプッシュされるため、エラーが発生することはありません。デバッグ中にトレースを試みますか?
MSDNから:http: //msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx
// explicit DLLImport needed here to use P/Invoke marshalling
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)]
// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);
extern "C"
繰り返しになりますが、C ++コードとCallingConvention.Cdecl
C#の両方にあります。なぜそうではないのCallingConvention.Stdcall
ですか?または、さらに、なぜ__stdcall
C ++にあるのですか?
前もって感謝します!