Share via


動態型別產生的可收集組件

可回收組件是可以卸載、但不會卸載建立這些組件時所在應用程式定義域的動態組件。 可回收組件及其所含型別使用的所有 Managed 與 Unmanaged 記憶體都可以回收, 而像是組件名稱等資訊都會從內部表格中移除。

若要啟用卸載,請在建立動態組件時使用 AssemblyBuilderAccess.RunAndCollect 旗標。 組件是暫時性的 (即無法儲存),而且受到可回收組件的限制一節所述的限制。 當您釋放所有與該組件關聯的物件之後,Common Language Runtime (CLR) 會自動卸載可回收組件。 就其他方面來說,建立和使用可回收組件的方式與其他動態組件相同。

可回收組件的存留期

關於可回收動態組件的存留期,是由它所包含型別的參考存在與否,以及從這些型別建立的物件所控制。 只要有一個或多個下列項目存在,Common Language Runtime 就不會卸載組件 (T 是組件中定義的任何型別):

  • T 的執行個體。

  • T 陣列的執行個體,或其型別引數中有一個 T 的泛型集合執行個體,即使這個陣列或集合是空的也一樣。

  • 表示 T 的 TypeTypeBuilder 執行個體。

注意事項注意事項

您必須釋放所有屬於組件一部分的物件。定義 T 的 ModuleBuilder 會保留 TypeBuilder 的參考,而 AssemblyBuilder 物件會保留 ModuleBuilder 的參考,因此必須釋放這些物件的參考。即使 T 建構中所使用的 LocalBuilderILGenerator 存在,也會造成無法卸載的情形。

  • 仍可藉由執行程式碼取得之其他動態定義型別 T1 的 T 靜態參考。 例如,T1 可能衍生自 T,或是 T 可能為 T1 之某個方法中的參數型別。

  • 屬於 T 之靜態欄位的 ByRef。

  • 參考 T 或 T 之元件的 RuntimeTypeHandleRuntimeFieldHandleRuntimeMethodHandle

  • 任何反映物件的執行個體,可以直接或間接用來存取表示 T 的 Type 物件。 例如,表示 T 的 Type 物件可以從元素型別為 T 的陣列型別取得,或從具有 T 型別引數的泛型型別取得。

  • 任何執行緒之呼叫堆疊上的方法 M,其中 M 是 T 的方法或組件中定義的模組層級方法。

  • 組件之模組中定義的靜態方法之委派。

即使組件中只有一個型別或一個方法存在上列清單中的單一個項目,執行階段依然無法卸載這個組件。

注意事項注意事項

在完成項執行過清單中所有項目以前,執行階段並不會實際卸載組件。

為了要追蹤存留期,在產生可回收組件時所建立與使用之已建構的泛型 (例如 List<int> (Visual Basic 中則為 List(Of Integer))) 會視為已經在包含泛型型別定義的組件中定義,或是在包含其中一個型別引數之定義的組件中定義。 實際使用的組件屬於實作細節,隨時可能會變更。

可回收組件的限制

下列限制適用於可回收組件:

  • 靜態參考:針對可回收組件中定義的型別,一般動態組件中的型別不能有該型別的靜態參考。 例如,如果您定義繼承可回收組件中型別的一般型別,就會擲回 NotSupportedException 例外狀況。 可回收組件中的型別可以有其他可回收組件之型別的靜態參考,但是這樣會將被參考組件的存留期延長為參考組件的存留期。

  • COM Interop:在可回收組件中無法定義任何 COM 介面,而且無法將可回收組件中的任何型別執行個體轉換為 COM 物件。 可回收組件中的型別無法當做 COM 可呼叫包裝函式 (CCW) 或執行階段可呼叫包裝函式 (RCW) 使用。 但是,可回收組件中的型別則可以使用會實作 COM 介面的物件。

  • 平台叫用:如果具有 DllImportAttribute 屬性的方法是在可回收組件中宣告的,將無法編譯。 OpCodes.Calli 指令無法在實作可回收組件中的型別時使用,而這類型別也無法封送處理至 Unmanaged 程式碼。 但是,您可以使用非可回收組件中宣告的進入點呼叫機器碼。

  • 封送處理:可回收組件中定義的物件 (特別是委派) 無法封送處理。 這是所有暫時性發出型別的限制。

  • 組件載入:反映發出是支援載入可回收組件的唯一機制。 以任何其他組件載入方式載入的組件將無法卸載。

  • 內容繫結物件:不支援內容靜態變數。 可回收組件中的型別無法擴充 ContextBoundObject。 但是,可回收組件中的程式碼可以使用其他地方定義的內容繫結物件。

  • 執行緒靜態資料:不支援執行緒靜態變數。

請參閱

其他資源

發出動態方法和組件