C# 主程式呼叫 C++ DLL,DLL 在 DLL_PROCESS_ATTACH 建立多個執行緒,DLL_PROCESS_DETACH 中嘗試關閉執行緒句柄並釋放資源,但關閉 C# 程式時 MessageBox 未彈出,進程仍殘留在工作管理員中。
DLL_PROCESS_DETACH 在進程正常退出時會被呼叫,但若進程被強制終止(如 Process.Kill()、使用者從工作管理員結束進程),DLL 卸載程式碼不會執行。Environment.Exit() 或主視窗關閉未正確等待背景執行緒,可能導致 DLL 卸載邏輯未跑完。FormClosing 事件中通知 DLL 執行清理函數(需額外匯出 Cleanup()),再 Application.Exit()。System.Diagnostics.Process.GetCurrentProcess().Kill();CloseHandle(僅關閉句柄,不終止執行緒)。正確做法是設定退出旗標,WaitForSingleObject 等待執行緒結束。// 全域退出旗標
volatile BOOL g_bExit = FALSE;
DWORD WINAPI WorkerThread(LPVOID) {
while (!g_bExit) { /* 工作 */ }
return 0;
}
case DLL_PROCESS_DETACH:
g_bExit = TRUE;
// 等待執行緒結束(需儲存執行緒 ID 或句柄陣列)
WaitForMultipleObjects(threadCount, hThreads, TRUE, 5000);
// 釋放資源...
break;