Customer Dubug Probe
C#から DLL をコールするとき stdcall, cdecl はどうなっているのか? を補足。
SSLI-CLRではCustomerCheckedBuildProbeと呼ばれる Probers を有効化する設定があるのだが、MSCLRの場合はCDPという。
なんで名前が違うにゃ! というのはおいといて、App.config にて
<configuration> <runtime> <developerSettings CDP.AllowDebugProbes="true" CDP.PInvokeCallConvMismatch="true" /> </runtime> </configuration>
のように設定できます。詳しいことは MS の CLR 上で動くアプリケーションをデバッグするためのデバッガの作り方〜な資料をみてもらうとして、
AllowDebugProbes
大事な大事な設定です。CDP を有効にします。
AllowDebugBreak
怖い怖い設定です。CDP は報告と同時にユーザブレイクポイントとして動作します。
つまり、この設定で動かしている状態でCDPの検査に引っかかると、アプリケーションが即死します。
PInvokeCallConvMismatch
SSCLI の StackImbalance に相当します。
P/Invoke および COM 相互呼び出しにおいて、呼び出し規約の間違いなどを原因としたスタック調整が発生した場合を検出します。
BufferOverrun
SSCLI の StackImbalance に相当します。
P/Invoke および COM 相互呼び出しにおいて、呼び出し用に用意された領域を超えて読み書きが発生した場合を検出します。
CollectedDelegate
SSCLI の CollectedDelegate に相当します。(って名前同じやん!)
Unmanaged に対してコールバック関数として delegate を渡すことができますが、static method ではなく instance method を渡した場合、対象となるオブジェクトが Unmanaged code から参照を得られない場合があります。*1
そのような場合に、Unmanaged 側からコールバックが発生した際、ガーベッジコレクタによって回収済みのオブジェクトのメソッドに対する呼び出しとして解決されることがありますが、そのような呼び出しを検出します。
FailedQI
SSCLI には同等の設定がありません。
COM 相互呼び出しで、.NET 側のオブジェクトに対する QueryInterface の失敗を検出すます。
InavlidIUnknown
SSCLI の InvalidIUnknown に相当します。(って、また名前同じやん!)
FailedQI と同じらしいです? COM 相互運用はまったく手を出していないのでよくわかりません。
DisconnectedContect
SSCLI には同等の設定がありません。
COM 相互呼び出しで、終了したアパートメントスレッドに対するアクセスが発生したことを検出します。
ObjNotKeptAlive
SSCLI には同等の設定がありません。(たぶん)
Managed Code から Unmanaged Code にマーシャリングされた暗黙的 COM インターフェスが、1度も AddRef されなかったことを検出します。
Apartment
SSCLI には同等の設定がありません。
シングルスレッドアパートメントとマルチスレッドアパートメントの間の行き来をレポートしてくれます。
Marshaling
SSCLI の Marshaling に相当します。(だから同じ名前…)
マーシャリングをレポートしてくれます。
NotMarshalable
SSCLI には同等の設定がありません。
マーシャリングの失敗をレポートしてくれます。