How to dynamically load and unload a native DLL file?

后端 未结 3 462
逝去的感伤
逝去的感伤 2020-12-06 11:22

I have a buggy third-party DLL files that, after some time of execution, starts throwing the access violation exceptions. When that happens I want to reload that DLL file. H

3条回答
  •  温柔的废话
    2020-12-06 11:42

    Try this

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr LoadLibrary(string libname);
    
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern bool FreeLibrary(IntPtr hModule);
    
    //Load
    IntPtr Handle = LoadLibrary(fileName);
    if (Handle == IntPtr.Zero)
    {
         int errorCode = Marshal.GetLastWin32Error();
         throw new Exception(string.Format("Failed to load library (ErrorCode: {0})",errorCode));
    }
    
    //Free
    if(Handle != IntPtr.Zero)
            FreeLibrary(Handle);
    

    If you want to call functions first you must create delegate that matches this function and then use WinApi GetProcAddress

    [DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
    private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); 
    
    
    IntPtr funcaddr = GetProcAddress(Handle,functionName);
    YourFunctionDelegate function = Marshal.GetDelegateForFunctionPointer(funcaddr,typeof(YourFunctionDelegate )) as YourFunctionDelegate ;
    function.Invoke(pass here your parameters);
    

提交回复
热议问题