2011-06-23 10 views
7

Mam niepoprawne pliki DLL innych firm, które po pewnym czasie wykonywania zaczynają wyrzucać wyjątki naruszenia dostępu. Kiedy tak się stanie, chcę przeładować ten plik DLL. Jak mogę to zrobić?Jak dynamicznie ładować i usuwać macierzysty plik DLL?

+2

Jak o ładowaniu dll do procesu proxy i zakończyć cały proces? Zwykle proces jest uznawany za uszkodzony po naruszeniu dostępu. – CodesInChaos

+0

Jak to zrobić? Niewiele słyszałem o AppDomains. Czy możesz podać przykład? – Poma

+1

Ponieważ jest to natywna biblioteka dll AppDomains nie pomoże. Trzeba mieć drugi proces, który ładuje bibliotekę dll, a następnie wykorzystuje pewną formę komunikacji między procesami do przesyłania połączeń między procesami. Zdalne .net może być jednym ze sposobów. Ale sam tego nie zrobiłem. – CodesInChaos

Odpowiedz

19

Spróbuj

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

Jeśli chcesz wywołać funkcje najpierw należy utworzyć delegeate który odpowiada tej funkcji a następnie użyć 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

A jak wywołać moje funkcje dll? Kiedy deklaruję je jako 'DllImport', to podejście nie działa – Poma

+1

Czy to rozwiązałeś? Czy możesz podać fragment kodu natywnego kodu? w jaki sposób powinien zostać zadeklarowany kod natywny i jak wygląda delegat? Dzięki – freshWoWer

+0

@Poma Czy to działa? Czy możesz mi powiedzieć, jak uzyskać działanie GetDelegateForFunctionPointer? – GuidoG

0

Utwórz proces roboczy, który komunikuje się poprzez COM lub kolejny mechanizm IPC. Następnie, gdy plik DLL umiera, możesz po prostu ponownie uruchomić proces roboczy.

0

Załaduj plik dll, wywołaj go, a następnie usuń, aż zniknie.

Dostosowałem następujący kod z przykładu VB.Net 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; 
    } 
Powiązane problemy