C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 102 を表示中)
■60917 / )  Re[7]: .NetFramework3.5から4に変更すると例外発生
□投稿者/ む (2回)-(2011/07/25(Mon) 23:06:12)
DLLの方で関数に__stdcall付けてますか?
呼出規約は付けてなければcdecl、あればstdcallのはず。

MSDNより:
CallingConvention フィールドの既定値は WinAPI です。この場合の既定の呼び出し規約は StdCall です。
http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.dllimportattribute.callingconvention

これより、3.5まではCallingConventionの指定なし:既定の呼出 ->Winapi = StdCallで呼び出していた。
4の場合、「PInvokeStackImbalance」の回避目的でCdeclを指定 -> 呼出規約が変わってスタックが・・・ -> 例外発生?
と思うんですけど、どうでしょう?

ついでにこんな情報も有るようです。

VisualStudio2010から、MDA(Managed Debugging Assistants)がデフォルトで有効になりました。
MDAは、ランタイムイベントに関するメッセージを発生させ、マネージコードからアンマネージコードへの遷移時に発生する検出が難しいバグを分離できる機能です。
PInvokeStackImbalanceは、このMDAによって検出されます。
・・・
PInvokeStackImbalanceが検出されても、問題が露呈せず動作します。
(PInvokeStackImbalanceを発生させ、食い違ったスタックの処理を.NETがうまくやります。)
そのため、PInvokeStackImbalanceを無効にするという方法が取られることがありますが、もっと良い方法があります。
それは、C#コンパイラに、MeCabのコンパイラの呼出規約を教えることです。
・・・
http://wiki.sh4e.net/?Tips%2FOther%2FMeCab

MDA pInvokeStackImbalance の無効化 ― CLR 2.0 でのデバッグ実行 (2)
http://d.hatena.ne.jp/NyaRuRu/20051224/p1
返信 編集キー/


管理者用

- Child Tree -