UPDATE UNTUK .NET 4.0 DAN KERANGKA BARU-BARU INI
Ini adalah pertanyaan lama yang ditanyakan pada saat .Net 2.0, ketika dukungan untuk DLL mode campuran mengalami masalah inisialisasi yang serius, rentan terhadap kebuntuan acak. Pada .Net 4.0, inisialisasi DLL mode campuran telah berubah. Sekarang ada dua tahap inisialisasi yang terpisah:
- Inisialisasi asli, dipanggil di titik masuk DLL, yang mencakup penyiapan waktu jalan C ++ asli dan eksekusi metode DllMain Anda.
- Inisialisasi terkelola, dijalankan secara otomatis oleh pemuat sistem.
Karena langkah # 2 dilakukan di luar Loader Lock, tidak ada jalan buntu. Detailnya dijelaskan di Initialization of Mixed Assemblies .
Untuk memastikan perakitan mode campuran Anda dapat dimuat dari eksekusi asli, satu-satunya hal yang perlu Anda periksa adalah bahwa metode DllMain dideklarasikan sebagai kode asli. #pragma unmanaged
bisa membantu di sini:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
... // your implementation here
}
Penting juga bahwa kode apa pun yang mungkin dipanggil DllMain secara langsung atau tidak langsung juga tidak dikelola. Masuk akal untuk membatasi jenis fungsionalitas yang digunakan oleh DllMain sehingga Anda melacak semua kode yang dapat dijangkau dari DllMain dan memastikan semuanya dikompilasi #pragma unmanaged
.
Compiler membantu sedikit dengan memberi Anda peringatan C4747 jika mendeteksi bahwa DllMain tidak dideklarasikan sebagai unmanaged:
1> Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint
Namun compiler tidak akan menghasilkan peringatan apa pun jika DllMain secara tidak langsung memanggil beberapa fungsi terkelola lainnya, jadi Anda perlu memastikan bahwa hal itu tidak akan pernah terjadi, jika tidak, aplikasi Anda dapat mengalami deadlock secara acak.