How to dynamically load and unload a native DLL file?

后端 未结 3 386
逝去的感伤
逝去的感伤 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);
    
    0 讨论(0)
  • 2020-12-06 11:55

    Create a worker process that communicates via COM or another IPC mechanism. Then when the DLL dies, you can just restart the worker process.

    0 讨论(0)
  • 2020-12-06 12:04

    Load the dll, call it, and then unload it till it's gone.

    I've adapted the following code from the VB.Net example here.

      [DllImport("powrprof.dll")]
      static extern bool IsPwrHibernateAllowed();
    
      [DllImport("kernel32.dll")]
      static extern bool FreeLibrary(IntPtr hModule);
    
      [DllImport("kernel32.dll")]
      static extern bool LoadLibraryA(string hModule);
    
      [DllImport("kernel32.dll")]
      static extern bool GetModuleHandleExA(int dwFlags, string ModuleName, ref IntPtr phModule);
    
      static void Main(string[] args)
      {
            Console.WriteLine("Is Power Hibernate Allowed? " + DoIsPwrHibernateAllowed());
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
      }
    
      private static bool DoIsPwrHibernateAllowed()
      {
            LoadLibraryA("powrprof.dll");
            var result = IsPwrHibernateAllowed();
            var hMod = IntPtr.Zero;
            if (GetModuleHandleExA(0, "powrprof", ref hMod))
            {
                while (FreeLibrary(hMod))
                { }
            }
            return result;
      }
    
    0 讨论(0)
提交回复
热议问题