อัปเดตสำหรับ. NET 4.0 และกรอบข้อมูลล่าสุดเพิ่มเติม
นี่เป็นคำถามเก่าที่ถูกถามในช่วงเวลาของ. Net 2.0 เมื่อการสนับสนุน DLL ในโหมดผสมมีปัญหาในการเริ่มต้นที่รุนแรงมีแนวโน้มที่จะเกิดการหยุดชะงักแบบสุ่ม ตั้งแต่. Net 4.0 การเริ่มต้นของ DLL ในโหมดผสมมีการเปลี่ยนแปลง ตอนนี้มีการเริ่มต้นสองขั้นตอนแยกกัน:
- การเริ่มต้นดั้งเดิมเรียกที่จุดเริ่มต้นของ DLL ซึ่งรวมถึงการตั้งค่ารันไทม์ C ++ ดั้งเดิมและการเรียกใช้เมธอด DllMain ของคุณ
- การเริ่มต้นที่มีการจัดการดำเนินการโดยอัตโนมัติโดยตัวโหลดระบบ
เนื่องจากขั้นตอน # 2 ดำเนินการนอก Loader Lock จึงไม่มีการหยุดชะงัก โดยมีรายละเอียดอธิบายไว้ที่การเริ่มต้นของการประกอบผสม
เพื่อให้แน่ใจว่าแอสเซมบลีโหมดผสมของคุณสามารถโหลดจากปฏิบัติการเนทีฟได้สิ่งเดียวที่คุณต้องตรวจสอบคือเมธอด DllMain ถูกประกาศเป็นโค้ดเนทีฟ #pragma unmanaged
สามารถช่วยได้ที่นี่:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
...
}
สิ่งสำคัญคือรหัสใด ๆ ที่ DllMain อาจเรียกโดยตรงหรือโดยอ้อมจะไม่ได้รับการจัดการด้วย มันทำให้รู้สึกที่จะ จำกัด ประเภทของฟังก์ชั่นการใช้งานโดย DllMain เพื่อให้คุณสามารถเข้าถึงได้ติดตามทุกรหัสจาก DllMain #pragma unmanaged
และให้แน่ใจว่ามันคือทั้งหมดที่รวบรวมกับ
คอมไพเลอร์ช่วยเล็กน้อยโดยให้คุณอุ่น C4747 หากตรวจพบว่า DllMain ไม่ได้รับการประกาศว่าไม่มีการจัดการ:
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
อย่างไรก็ตามคอมไพเลอร์จะไม่สร้างคำเตือนใด ๆ หาก DllMain เรียกใช้ฟังก์ชันที่มีการจัดการอื่น ๆ โดยอ้อมดังนั้นคุณต้องแน่ใจว่าจะไม่เกิดขึ้นมิฉะนั้นแอปพลิเคชันของคุณอาจหยุดชะงักแบบสุ่ม