Tra le tante feature di Visual Studio 2005 dedicate al debug, ce n'è una che prende il nome di LoaderLock managed debugging assistant (MDA):
The LoaderLock managed debugging assistant (MDA) detects attempts to execute managed code on a thread that holds the Microsoft Windows operating system loader lock. Any such execution is illegal because it can lead to deadlocks and to use of DLLs before they have been initialized by the operating system's loader.
Se il LoaderLock individua una situazione come quella descritta, interrompe il programma lanciando un'eccezione con questo messaggio:
Attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.
In alcuni casi, tuttavia, esso si rivela troppo "smart" e segnala il problema anche quando, in realtà, non dovrebbe. Ho letto di questo inconveniente su diversi forum e io stesso ne sono stato vittima, tentando di creare con Visual C++ una DLL, che a sua volta richiamava una libreria di terze parti, e utilizzando poi il Platform Invoke per accedere alle sue funzionalità da un programma C#.
In una situazione del genere, si può provare a disabilitare il controllo effettuato dal LoaderLock: selezionare il comando Exceptions dal menu Debug, quindi espandere il ramo Managed Debug Assistants e disabilitare il segno di spunta nella colonna Throw in corrispondenza della voce LoaderLock. Così facendo, se effettivamente il LoaderLock aveva segnalato un problema reale, tentando di richiamare la funzione si otterrà il blocco dell'applicazione; in caso contrario (come è capitato a me), il vostro progetto tornerà a funzionare correttamente.