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 には同等の設定がありません。
マーシャリングの失敗をレポートしてくれます。

Marshaling.Filter

SSCLI には同等の設定がありません。(たぶん)
Marshaling と NotMarshalable の出力をフィルタリングできます。




Customer Dubug Probe ですが、.NET 1.1 限定です。
.NET 1.0 および .NET 2.0 beta では利用できません。
また、便利そうな機能もありますが、on にすると実用に耐えられないぐらいの負荷がかかりますので、常時 ON はおすすめできません。*2

*1:GCHandle を利用して参照を与えるのが正しいと思います

*2:私のPCのスペックが低いだけかー