2010-04-02 6 views
1

J'essaie d'écrire une application qui prend le son du périphérique d'enregistrement audio par défaut sur un ordinateur. Lors de l'exécution de tout code qui accède à DirectX à partir de mon code managé je reçois cette erreur:LoaderLock a été détecté, et la désactivation de l'avertissement n'aide pas

DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX.DirectSound\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.DirectSound.dll' is 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.

DevicesCollection coll = new DevicesCollection(); 

et

Device d = new Device(DSoundHelper.DefaultCaptureDevice); 

et

Capture c = new Capture(DSoundHelper.DefaultCaptureDevice); 

provoquent tous les LoaderLock MDA pour faire apparaître et dites-moi qu'il y a un problème. J'ai récuré l'Internet (stackoverflow inclus) pour des solutions à ce problème, mais la plupart des gens disent juste pour désactiver l'avertissement, qui ne fonctionne pas. Lorsque je désactive l'avertissement, une exception générique ApplicationException est lancée, ce qui est encore moins utile. J'ai vu les réponses à this question, ce qui n'a pas aidé car il a dit de supprimer le code qui cause l'erreur. D'autres ont dit "réparer votre code".

Mes questions sont les suivantes:

comment puis-je appeler tout (de préférence géré) code DirectX à partir de C# sans obtenir cette erreur?

edit: c'est la trace de la pile je reçois:

at Microsoft.DirectX.DirectSound.Device..ctor(Guid guidDev) 
at Autotuner.fMain.button1_Click(Object sender, EventArgs e) in C:\\Users\\Scott\\Documents\\Visual Studio 2008\\Projects\\Autotuner\\Autotuner\\Form1.cs:line 17 
at System.Windows.Forms.Control.OnClick(EventArgs e) 
at System.Windows.Forms.Button.OnClick(EventArgs e) 
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
at System.Windows.Forms.Control.WndProc(Message& m) 
at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
at System.Windows.Forms.Button.WndProc(Message& m) 
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.Run(Form mainForm) 
at Autotuner.Program.Main() in C:\\Users\\Scott\\Documents\\Visual Studio 2008\\Projects\\Autotuner\\Autotuner\\Program.cs:line 18 
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ThreadHelper.ThreadStart() 
+0

Quelle exception est levée? – SLaks

+0

Une exception est bonne, postez le StackTrace. –

+1

est littéralement appelé ApplicationException avec le message "Erreur dans l'application" –

Répondre

2

En dehors de l'environnement géré, l'une des façons les plus simples en C++ pour exécuter du code dans le verrouillage du chargeur est d'avoir des classes intégrées dans l'exercice de dll leur initialisation à l'échelle mondiale.

La seule heure d'initialisation des objets dll est lors des messages DllMain du système d'exploitation - mais pendant ces messages, le verrouillage du chargeur est actif. le verrou du chargeur empêche les différents threads de charger la DLL en entrant DllMain d'une seule DLL en même temps.

Pour résoudre le problème est assez difficile en C++ (et, vraisemblablement les environnements gérés) car il y a éventuellement beaucoup d'objets implicites nécessitant une construction dans une DLL. Néanmoins, vous devez trouver le code d'initialisation qui est appelé à partir de DllMain, et assurez-vous que, bien, son appel à partir des fonctions d'initialisation/d'arrêt explicites les exportations dll, ou fait juste-à-temps.

Questions connexes