Marshal.ReleaseComObject(Object) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
遞減與指定 COM 物件相關聯的執行階段可呼叫包裝函式 (RCW) 參考計數。
public:
static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer
參數
- o
- Object
要釋放的 COM 物件。
傳回
與 o
關聯的 RCW 之參考計數的新值。 這個值通常為零,因為不論呼叫的 Managed 用戶端數目,RCW 只保留一個包裝的 COM 物件參考。
- 屬性
例外狀況
o
不是有效的 COM 物件。
o
為 null
。
備註
這個方法可用來明確控制從Managed程式碼使用之 COM物件的存留期。 您應該使用這個方法釋放基礎 COM 物件,該物件會及時保留資源的參考,或必須以特定順序釋放物件時。
每次 COM 介面指標進入 Common Language Runtime (CLR) 時,都會包裝在 RCW 中。
RCW 有一個參考計數,每次 COM 介面指針對應至它時都會遞增。 方法 ReleaseComObject 會遞減 RCW 的參考計數。 當參考計數達到零時,運行時間會在 Unmanaged COM 物件上釋放其所有參考,如果您嘗試進一步使用 物件,則會擲 System.NullReferenceException 回 。 如果相同的 COM 介面從 Unmanaged 傳遞一次到 Managed 程式代碼,則每次包裝函式上的參考計數都會遞增,而呼叫 ReleaseComObject 會傳回剩餘的參考數目。
這個方法可讓您強制 RCW 參考計數版本,以便在您想要時精確發生。 不過,不當使用 ReleaseComObject 可能會導致您的應用程式失敗,或可能會導致存取違規。
請考慮應用程式域中 Managed 程式代碼保存在代表 COM 元件的 RCW 的案例。 如果您在 RCW 上呼叫 ReleaseComObject 方法,Managed 程式代碼將無法存取 RCW,而且會引發 InvalidComObjectException 例外狀況。
如果 RCW 的呼叫在發行 RCW 時執行,可能會發生更嚴重的錯誤。 在此情況下,進行呼叫的線程可能會造成存取違規。 不過,進程記憶體可能會損毀,而且進程可能會繼續執行,直到因為難以偵錯的原因而失敗為止。
當使用的 COM 元件為單一時,此風險會加總:基於下列原因:CLR 會呼叫 COM CoCreateInstance 函式來啟動 COM 元件,每次呼叫單一 COM 元件時都會傳回相同的介面指標。 因此,應用程式域中個別且獨立的 Managed 程式代碼片段可以針對單一 COM 元件使用相同的 RCW,如果其中一個呼叫 ReleaseComObject COM 元件上的 方法,另一個程式代碼將會中斷。
因此,只有在絕對必要時才使用 ReleaseComObject 。 如果您想要呼叫這個方法,以確保 COM 元件在決定時釋出,請考慮改用 FinalReleaseComObject 方法。 FinalReleaseComObject 無論重新輸入 CLR 多少次,都會釋放基礎 COM 元件。 每次 COM 元件重新輸入 CLR 時,RCW 的內部參考計數都會遞增一個。 因此,您可以在迴圈中呼叫 ReleaseComObject 方法,直到傳回的值是零為止。 這可達到與方法相同的結果 FinalReleaseComObject 。