Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mengaktifkan atau menonaktifkan pemisahan modul virtual.
Syntax
HRESULT EnableVirtualModuleSplitting(
BOOL enableSplitting
);
Parameter-parameternya
enableSplitting
true untuk mengaktifkan pemisahan modul virtual; false untuk menonaktifkannya.
Komentar
Pemisahan modul virtual menyebabkan ICorDebug mengenali modul yang digabungkan bersama selama proses build dan menyajikannya sebagai sekelompok modul terpisah daripada satu modul besar. Melakukan ini mengubah perilaku berbagai metode ICorDebug yang dijelaskan di bawah ini.
Nota
Metode ini hanya tersedia dengan .NET Native.
Metode ini dapat dipanggil dan nilai enableSplitting dapat diubah kapan saja. Ini tidak menyebabkan perubahan fungsional stateful dalam objek ICorDebug , selain mengubah perilaku metode yang tercantum dalam pemisahan modul Virtual dan bagian API debugging yang tidak dikelola pada saat mereka dipanggil. Menggunakan modul virtual memang dikenakan penalti performa saat memanggil metode tersebut. Selain itu, penembolokan dalam memori yang signifikan dari metadata virtual mungkin diperlukan untuk mengimplementasikan API IMetaDataImport dengan benar, dan cache ini dapat dipertahankan bahkan setelah pemisahan modul virtual dimatikan.
Terminologi
Istilah berikut digunakan saat menjelaskan pemisahan modul virtual:
modul kontainer, atau kontainer Modul agregat.
sub-modul, atau modul virtual Modul yang ditemukan dalam kontainer.
Modul reguler yang tidak digabungkan pada waktu build. Keduanya bukan modul kontainer atau sub-modul.
Modul kontainer dan sub-modul diwakili oleh ICorDebugModule objek antarmuka. Namun, perilaku antarmuka sedikit berbeda dalam setiap kasus.
Modul dan rakitan
Rakitan multi-modul tidak didukung untuk skenario penggabungan perakitan, sehingga ada hubungan satu-ke-satu antara modul dan rakitan. Setiap ICorDebugModule objek, terlepas dari apakah itu mewakili modul kontainer atau sub-modul, memiliki objek ICorDebugAssembly yang sesuai. Metode ICorDebugModule::GetAssembly mengonversi dari modul ke rakitan. Untuk memetakan ke arah lain, metode ICorDebugAssembly::EnumerateModules hanya menghitung 1 modul. Karena rakitan dan modul membentuk pasangan yang digabungkan erat dalam hal ini, istilah perakitan dan modul menjadi sebagian besar dapat dipertukarkan.
Perbedaan perilaku
Modul kontainer memiliki perilaku dan karakteristik berikut:
Metadata mereka untuk semua sub-modul konstituen digabungkan bersama-sama.
Nama jenis mereka mungkin bergumul.
Metode ICorDebugModule::GetName mengembalikan jalur ke modul on-disk.
Metode ICorDebugModule::GetSize mengembalikan ukuran gambar tersebut.
Metode ICorDebugAssembly3.EnumerateContainedAssemblies mencantumkan sub-modul.
Metode ICorDebugAssembly3.GetContainerAssembly mengembalikan
S_FALSE.
Sub-modul memiliki perilaku dan karakteristik berikut:
Mereka memiliki sekumpulan metadata yang berkurang yang hanya sesuai dengan rakitan asli yang digabungkan.
Nama metadata tidak tergali.
Token metadata tidak mungkin cocok dengan token di rakitan asli sebelum digabungkan dalam proses build.
Metode ICorDebugModule::GetName mengembalikan nama rakitan, bukan jalur file.
Metode ICorDebugModule::GetSize mengembalikan ukuran gambar asli yang tidak digabungkan.
Metode ICorDebugModule3.EnumerateContainedAssemblies mengembalikan
S_FALSE.Metode ICorDebugAssembly3.GetContainerAssembly mengembalikan modul yang berisi.
Antarmuka yang diambil dari modul
Berbagai antarmuka dapat dibuat atau diambil dari modul. Beberapa di antaranya meliputi:
Objek ICorDebugClass, yang dikembalikan oleh metode ICorDebugModule::GetClassFromToken .
Objek ICorDebugAssembly, yang dikembalikan oleh metode ICorDebugModule::GetAssembly .
Objek-objek ini selalu di-cache oleh ICorDebug, dan mereka akan memiliki identitas pointer yang sama terlepas dari apakah mereka dibuat atau dikueri dari modul kontainer atau sub-modul. Sub-modul menyediakan tampilan terfilter dari objek yang di-cache ini, bukan cache terpisah dengan salinannya sendiri.
Pemisahan modul virtual dan API penelusuran kesalahan yang tidak dikelola
Tabel berikut menunjukkan bagaimana pemisahan modul virtual memengaruhi perilaku metode lain dalam API debugging yang tidak dikelola.
| Metode | enableSplitting = true |
enableSplitting = false |
|---|---|---|
| ICorDebugFunction::GetModule | Mengembalikan sub-modul fungsi ini awalnya didefinisikan dalam | Mengembalikan modul kontainer yang digabungkan fungsi ini |
| ICorDebugClass::GetModule | Mengembalikan sub-modul kelas ini awalnya didefinisikan. | Mengembalikan modul kontainer tempat kelas ini digabungkan. |
| ICorDebugModuleDebugEvent::GetModule | Mengembalikan modul kontainer yang dimuat. Sub-modul tidak diberikan peristiwa beban terlepas dari pengaturan ini. | Mengembalikan modul kontainer yang dimuat. |
| ICorDebugAppDomain::EnumerateAssemblies | Mengembalikan daftar sub-rakitan dan rakitan reguler; tidak ada rakitan kontainer yang disertakan. Nota: Jika ada rakitan kontainer yang hilang simbol, tidak ada sub-rakitannya yang akan dijumlahkan. Jika ada rakitan reguler yang hilang, simbol tersebut mungkin atau mungkin tidak dijumlahkan. | Mengembalikan daftar rakitan kontainer dan rakitan reguler; tidak ada sub-rakitan yang disertakan. Nota: Jika ada rakitan reguler yang hilang, simbol tersebut mungkin atau mungkin tidak dijumlahkan. |
| ICorDebugCode::GetCode (jika merujuk ke kode IL saja) | Mengembalikan IL yang akan valid dalam gambar rakitan pra-gabung. Secara khusus, token metadata sebaris apa pun akan dengan benar menjadi token TypeRef atau MemberRef ketika jenis yang dirujuk tidak ditentukan dalam modul virtual yang berisi IL. Token TypeRef atau MemberRef ini dapat dicari di objek IMetaDataImport untuk objek virtual ICorDebugModule yang sesuai. |
Mengembalikan IL dalam gambar rakitan pasca-penggabungan. |
Persyaratan
Platform: Lihat Sistem operasi yang didukung .NET.
Header: CorDebug.idl, CorDebug.h
Perpustakaan: CorGuids.lib
Versi .NET: Tersedia sejak .NET Framework 4.6