NET 4.0 İÇİN GÜNCELLEME VE DAHA SON ÇERÇEVELER
Bu, .Net 2.0 zamanında sorulan eski bir sorudur, karma mod DLL desteği ciddi başlatma sorunları yaşadığında, rastgele kilitlenmelere meyilliydi. .Net 4.0'dan itibaren, karma mod DLL'lerin başlatılması değişmiştir. Şimdi iki ayrı başlatma aşaması var:
- DllMain yönteminizin yerel C ++ çalışma zamanı kurulumunu ve yürütülmesini içeren DLL'nin giriş noktasında çağrılan yerel başlatma.
- Yönetimli başlatma, sistem yükleyici tarafından otomatik olarak yürütülür.
2. adım, Yükleyici Kilidinin dışında gerçekleştirildiğinden, herhangi bir kilitlenme yoktur. Ayrıntılar, Karma Meclislerin Başlatma bölümünde açıklanmıştır .
Karma mod derlemenizin yerel bir yürütülebilir dosyadan yüklenebilmesini sağlamak için, kontrol etmeniz gereken tek şey DllMain yönteminin yerel kod olarak bildirilmesidir. #pragma unmanaged
burada yardımcı olabilir:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
...
}
DllMain'in doğrudan veya dolaylı olarak çağırabileceği herhangi bir kodun da yönetilmemesi önemlidir. DllMain tarafından kullanılan işlevsellik türünü sınırlamak mantıklıdır, böylece DllMain'den erişilebilen tüm kodları izleyebilir ve tümünün derlendiğinden emin olabilirsiniz #pragma unmanaged
.
Derleyici, DllMain'in yönetilmeyen olarak bildirilmediğini algılarsa C4747'yi uyararak size biraz yardımcı olur:
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
Ancak, DllMain dolaylı olarak başka bir yönetilen işlevi çağırırsa, derleyici herhangi bir uyarı üretmez, bu nedenle bunun asla gerçekleşmediğinden emin olmanız gerekir, aksi takdirde uygulamanız rastgele kilitlenebilir.