2012-06-28 26 views
10

Estoy trabajando en un servicio web que interactúa con una DLL nativa y uso LoadLibrary/GetModuleHandle/FreeLIbrary y GetProcAddress para cargar/descargar dinámicamente la DLL porque no es muy estable.¿Las funciones LoadLibrary, FreeLibrary y GetModuleHandle Win32 son seguras?

public class NativeMethods 
{ 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr LoadLibrary(string libname); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr GetModuleHandle(string libname); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern bool FreeLibrary(IntPtr hModule); 

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi)] 
    public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); 
} 

me he dado cuenta de que el proceso w3wp.exe se bloquea occationally bajo carga pesada y cuando traté de depurarlo el depurador a menudo se detiene en mi llamada a la función NativeMethods.GetModuleHandle().

no pude encontrar ninguna evidencia de que GetModuleHandle no es seguro para subprocesos por lo que me pregunto ¿alguien tiene alguna experiencia similar al interactuar estas funciones kernel32.dll de aplicaciones de subprocesos múltiples .NET?

Oscar

+1

LoadLibrary y FreeLibrary deberían ser seguros para hilos en relación con la lista de cargas DLL, y en teoría también debería GetModuleHandle, sin embargo, probablemente usaría un par LoadLibrary/FreeLibrary en lugar de usar ese método para asegurarse de tener una referencia a la biblioteca y no puede simplemente desaparecer de la memoria mientras lo estás usando. – tyranid

Respuesta

6

De acuerdo con Igor Tandetnik (Microsoft MVP).

Aparte de las funciones GDI que no son seguras para subprocesos. Casi cualquier cosa que tome un HWND y/o un HDC debe invocarse en el mismo subproceso donde se creó HWND o HDC (SendMessage, PostMessage y excepciones similares). HBITMAP s, HICON s y tales se pueden pasar entre hilos, pero deben manipularse por un hilo a la vez.

La mayoría de las otras funciones (aquellas que no se ocupan de GDI o gestión de ventanas) son, de hecho, seguras para subprocesos.

Esto debería incluir LoadLibrary, GetModuleHandle, FreeLibrary y GetProcAddress.

Sin embargo, tenga en cuenta que FreeLibrary no debe llamarse desde DllMain.

También puedo agregar que he estado utilizando estas funciones en un entorno de subprocesos múltiples durante bastante tiempo sin problemas.

+0

https://mvp.support.microsoft.com/profile=b3eb0170-44f2-4819-b048-8616caa4d107/http://social.msdn.microsoft.com/profile/igor%20tandetnik/?ws=usercard-mini (Si esta es la persona correcta, ¿no funciona para MS? pero él es un MVP ... – Anders

+0

Respuesta modificada para reflejar el comentario anterior –

+0

Tenga en cuenta que 'LoadLibrary' incrementa el recuento de referencias del módulo, mientras que' GetModuleHandle' NO incrementa el recuento de referencias del módulo. Lamentablemente, esto hace que 'GetModuleHandle' no sea seguro para subprocesos. Consulte la sección ** Observaciones ** para obtener más detalles: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx Nota clave: ** Por ejemplo, supongamos que un subproceso recupera un identificador de módulo, pero antes de que use el manejador, un segundo subproceso libera el módulo. .... ** –

Cuestiones relacionadas