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 koleksiT
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 pembuatanT
mencegah pembongkaran.Referensi statis ke
T
oleh jenisT1
lain yang ditentukan secara dinamis yang masih dapat dijangkau dengan mengeksekusi kode. Misalnya,T1
mungkin berasal dariT
, atauT
mungkin merupakan jenis parameter dalam metodeT1
.ByRef
ke bidang statis milikT
.RuntimeTypeHandle, RuntimeFieldHandle, atau RuntimeMethodHandle yang mengacu pada
T
atau ke komponenT
.Instans objek pantulan apa pun yang dapat digunakan secara tidak langsung atau langsung untuk mengakses objek Type yang mewakili
T
. Misalnya, objek Type untukT
dapat diperoleh dari jenis array yang jenis elemennya adalahT
, atau dari jenis generik yang memilikiT
sebagai argumen jenis.Metode
M
pada tumpukan panggilan dari rangkaian apa pun, yang manaM
adalah metodeT
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk