gcManagedToUnmanaged MDA

每當執行緒從 Mananged 轉換到 Unmanaged 程式碼時,gcManagedToUnmanaged Managed 偵錯助理 (MDA) 就會造成記憶體回收。

症狀

嘗試使用已經公開至 COM 的 Managed 物件時,Unmanaged 使用者元件會擲回存取違規。 COM 物件看起來似乎已經釋放。 此存取違規屬於非決定性的違規。

原因

如果 Unmanaged 元件沒有正確地參考計數 (Reference Counting) Managed COM 物件,當 Unmanaged 元件仍然持有該物件的參考時,執行階段可能會回收公開至 COM 的 Managed 物件。 執行階段會在進行記憶體回收期間呼叫 Release,因此,如果使用者元件在發生記憶體回收之前使用物件,該物件將不會遭到回收。 這就是非決定性的來源。

解決方式

啟用這個助理會減少物件適合回收和呼叫 Release 之間的時間,有助於追蹤哪個 Unmanaged 元件先嘗試存取回收的物件。

對執行階段的影響

每當執行緒從 Managed 轉換到 Unmanaged 程式碼時,都會造成記憶體回收。

Output

這個 MDA 不會產生輸出。

組態

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

請參閱

參考

MarshalAsAttribute

gcUnmanagedToManaged MDA

概念

診斷 Managed 偵錯助理的錯誤

Interop 封送處理

其他資源

互通性