Assembly yang dapat dikumpulkan untuk pembuatan jenis dinamis

Assembly yang dapat dikumpulkan adalah assembly dinamis yang dapat dibongkar tanpa membongkar domain aplikasi tempat assembly dibuat. Semua memori terkelola dan tidak terkelola yang digunakan oleh assembly yang dapat dikumpulkan dan jenis yang dikandungnya dapat diklaim kembali. Informasi seperti nama assembly dihapus dari tabel internal.

Untuk mengaktifkan pembongkaran, gunakan bendera AssemblyBuilderAccess.RunAndCollect saat Anda membuat assembly dinamis. Rakitan bersifat sementara (yaitu, tidak dapat disimpan) dan tunduk pada batasan yang dijelaskan di bagian Pembatasan pada rakitan yang dapat dikumpulkan. Runtime bahasa umum (CLR) membongkar assembly yang dapat dikumpulkan secara otomatis saat Anda merilis semua objek yang terkait dengan assembly. Dalam semua hal lain, assembly yang dapat dikumpulkan dibuat dan digunakan dengan cara yang sama seperti assembly dinamis lainnya.

Masa pakai assembly yang dapat dikumpulkan

Masa pakai assembly yang dapat dikumpulkan dikendalikan oleh eksistensi referensi ke jenis yang dikandungnya dan objek yang dibuat dari jenis tersebut. Runtime bahasa umum tidak membongkar assembly selama satu atau beberapa hal berikut ini ada (T adalah jenis apa pun yang didefinisikan dalam assembly):

  • Instans T.

  • Instans array T.

  • Instans jenis generik yang memiliki T sebagai salah satu argumen jenisnya. Ini termasuk koleksi T generik, meskipun koleksi tersebut kosong.

  • Instans Type atau TypeBuilder yang mewakili T.

    Penting

    Anda harus melepaskan semua objek yang mewakili bagian dari assembly. ModuleBuilder yang mendefinisikan T menyimpan referensi ke TypeBuilder, dan objek AssemblyBuilder menyimpan referensi ke ModuleBuilder, sehingga referensi ke objek ini harus dirilis. Bahkan eksistensi LocalBuilder atau ILGenerator yang digunakan dalam pembuatan T mencegah pembongkaran.

  • Referensi statis ke T oleh jenis T1 lain yang ditentukan secara dinamis yang masih dapat dijangkau dengan mengeksekusi kode. Misalnya, T1 mungkin berasal dari T, atau T mungkin merupakan jenis parameter dalam metode T1.

  • ByRef ke bidang statis milik T.

  • RuntimeTypeHandle, RuntimeFieldHandle, atau RuntimeMethodHandle yang mengacu pada T atau ke komponen T.

  • Instans objek pantulan apa pun yang dapat digunakan secara tidak langsung atau langsung untuk mengakses objek Type yang mewakili T. Misalnya, objek Type untuk T dapat diperoleh dari jenis array yang jenis elemennya adalah T, atau dari jenis generik yang memiliki T sebagai argumen jenis.

  • Metode M pada tumpukan panggilan dari rangkaian apa pun, yang mana M adalah metode T atau metode tingkat modul yang ditentukan dalam assembly.

  • Delegasi ke metode statis yang ditentukan dalam modul perakitan.

Jika hanya satu item dari daftar ini ada hanya untuk satu jenis atau satu metode dalam assembly, runtime tidak dapat membongkar assembly.

Catatan

Runtime tidak benar-benar membongkar assembly sampai pengakhir berjalan untuk semua item dalam daftar.

Untuk tujuan pelacakan masa pakai, jenis generik yang dibangun seperti List<int> (dalam C#) atau List(Of Integer) (di Visual Basic) yang dibuat dan digunakan dalam pembuatan rakitan yang dapat dikumpulkan dianggap telah didefinisikan baik dalam rakitan yang berisi definisi jenis generik atau dalam rakitan yang berisi definisi salah satu argumen jenisnya. Rakitan yang tepat yang digunakan adalah detail implementasi dan dapat berubah.

Pembatasan assembly yang dapat dikumpulkan

Pembatasan berikut berlaku untuk assembly yang dapat dikumpulkan:

  • Referensi statis

    Jenis dalam rakitan dinamis biasa tidak dapat memiliki referensi statis ke jenis yang ditentukan dalam rakitan yang dapat dikumpulkan. Misalnya, jika Anda menentukan jenis biasa yang mewarisi dari jenis dalam assembly yang dapat dikumpulkan, pengecualian NotSupportedException akan dilemparkan. Jenis dalam assembly yang dapat dikumpulkan dapat memiliki referensi statis ke jenis di assembly lain yang dapat dikumpulkan, tetapi ini memperpanjang masa pakai assembly yang dirujuk ke masa pakai assembly referensi.

Pembatasan berikut berlaku untuk rakitan yang dapat dikumpulkan di .NET Framework:

  • Interop COM

    Tidak ada antarmuka COM yang dapat didefinisikan dalam rakitan yang dapat dikumpulkan, dan tidak ada instans jenis dalam rakitan yang dapat dikumpulkan yang dapat dikonversi menjadi objek COM. Jenis dalam assembly yang dapat dikumpulkan tidak dapat berfungsi sebagai COM callable wrapper (CCW) atau runtime callable wrapper (RCW). Namun, jenis dalam assembly yang dapat dikumpulkan dapat menggunakan objek yang mengimplementasikan antarmuka COM.

  • Pemanggilan platform

    Metode yang memiliki DllImportAttribute atribut tidak akan dikompilasi ketika dideklarasikan dalam rakitan yang dapat dikumpulkan. Instruksi OpCodes.Calli tidak dapat digunakan dalam implementasi jenis dalam assembly yang dapat dikumpulkan, dan jenis tersebut tidak dapat dinaikkan ke kode tak terkelola. Namun, Anda dapat memanggil kode asli dengan menggunakan titik masuk yang dinyatakan dalam rakitan yang tidak dapat dikumpulkan.

  • Marshaling

    Objek (khususnya, delegasi) yang didefinisikan dalam rakitan yang dapat dikumpulkan tidak dapat dinaikkan. Ini adalah pembatasan pada semua jenis yang dipancarkan sementara.

  • Pemuatan rakitan

    Pancaran pantulan adalah satu-satunya mekanisme yang didukung untuk memuat rakitan yang dapat dikumpulkan. Assembly yang dimuat dengan menggunakan bentuk pemuatan assembly lainnya tidak dapat dibongkar.

  • Objek terikat konteks

    Variabel konteks-statis tidak didukung. Jenis dalam assembly yang dapat dikumpulkan tidak dapat memperpanjang ContextBoundObject. Namun, kode dalam assembly yang dapat dikumpulkan dapat menggunakan objek terikat konteks yang ditentukan di tempat lain.

  • Data thread-static

    Variabel thread-static tidak didukung.

Pembatasan berikut berlaku untuk rakitan yang dapat dikumpulkan dalam versi .NET Framework dan .NET sebelum .NET 9:

  • Bidang statis dengan FixedAddressValueTypeAttribute

    Bidang statis yang didefinisikan dalam rakitan yang dapat dikumpulkan tidak dapat FixedAddressValueTypeAttribute menerapkan atribut .

Lihat juga