dirtyCastAndCallOnInterface MDA
注意
本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。
在已標記為僅限晚期繫結的類別介面上,嘗試透過 vtable 進行早期繫結呼叫時,會啟動 dirtyCastAndCallOnInterface
Managed 偵錯助理 (MDA)。
徵兆
將經由 COM 進行的早期繫結呼叫置入 CLR 時,應用程式會擲回存取違規或發生未預期的行為。
原因
程式碼嘗試經由僅限晚期繫結的類別介面,透過 vtable 進行早期繫結呼叫。 請注意,預設會將類別介面識別為僅限晚期繫結。 使用 ClassInterfaceAttribute 屬性搭配 AutoDispatch 值 ([ClassInterface(ClassInterfaceType.AutoDispatch)]
),也可能將類別介面識別為晚期繫結。
解決方法
建議的解決方式是定義明確介面以供 COM 使用,並讓 COM 用戶端透過這個介面 (而不是透過自動產生的類別介面) 進行呼叫。 或者,從 COM 的呼叫也可以轉換成經由 IDispatch
的晚期繫結程序呼叫。
最後,您可以將類別識別為 AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]
),以允許從 COM 發出早期繫結呼叫;不過由於 ClassInterfaceAttribute 中所述的版本控制限制,強烈不建議使用 AutoDual。
對執行階段的影響
此 MDA 對 CLR 沒有影響。 它只會報告有關晚期繫結介面上之早期繫結呼叫的資料。
輸出
以早期繫結存取之方法或欄位的名稱。
組態
<mdaConfig>
<assistants>
<dirtyCastAndCallOnInterface />
</assistants>
</mdaConfig>