Как динамически загружать и выгружать нативный файл DLL? - PullRequest
9 голосов
/ 23 июня 2011

У меня глючные сторонние DLL-файлы, которые после некоторого времени запуска начинают выдавать исключения нарушения прав доступа. Когда это произойдет, я хочу перезагрузить этот файл DLL. Как мне это сделать?

Ответы [ 3 ]

22 голосов
/ 23 июня 2011

Попробуйте это

[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);

Если вы хотите сначала вызвать функции, вы должны создать делегата, который соответствует этой функции, а затем использовать 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 голосов
/ 20 февраля 2013

Загрузите dll, позвоните ему, а затем выгрузите, пока он не исчезнет.

Я адаптировал следующий код из примера VB.Net здесь .

  [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 голосов
/ 09 января 2012

Создайте рабочий процесс, который взаимодействует через COM или другой механизм IPC. Затем, когда DLL умирает, вы можете просто перезапустить рабочий процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...