2011-06-23 37 views
7

Bir yürütme süresinden sonra erişim ihlali istisnası atmaya başlayan bir üçüncü taraf DLL dosyaları arabası var. Bu olduğunda, o DLL dosyasını yeniden yüklemek istiyorum. Bunu nasıl yaparım?Yerel bir DLL dosyası dinamik olarak nasıl yüklenir ve boşaltır?

+2

nasıl tüm süreci bir proxy sürecine dll yüklenirken ve sonlandırmak olacak? Erişim ihlallerinden sonra genellikle bir süreç kırılır. – CodesInChaos

+0

Nasıl yapmalı? AppDomains hakkında çok az şey duydum. Biraz örnek gönderir misiniz? – Poma

+1

Yerel dll olduğu için, Uygulama Alanları size yardımcı olmayacaktır. Dll'yi yükleyen ve daha sonra işlemler arasındaki çağrıları aktarmak için bir çeşit süreçler arası iletişim kullanan ikinci bir işleminizin olması gerekir. .net remoting tek yönlü olabilir. Ama ben bunu kendim yapmadım. – CodesInChaos

cevap

19

deneyin bu

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

Eğer aracılığıyla iletişim kuran bir işçi süreç oluşturun 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

Ve dll işlevlerimi nasıl çağırırım? Onları "DllImport" olarak bildirdiğimde bu yaklaşım işe yaramıyor – Poma

+1

Bunu çözdünüz mü? Yerel kodun bazı kod snipp'lerini sağlayabilir misiniz? Yerel kod nasıl bildirilmeli ve temsilci nasıl görünmelidir? Teşekkürler – freshWoWer

+0

@Poma Bunu işe aldın mı? Lütfen GetDelegateForFunctionPointer'ın nasıl çalıştığını söyler misiniz? – GuidoG

0

kullanmak sonra öncelikle bu işlevi maçları delegeate oluşturmalısınız işlevleri çağırmak ve isterseniz COM veya başka bir IPC mekanizması. Sonra DLL öldüğünde, yalnızca çalışan işlemini yeniden başlatabilirsiniz.

0

dll'yi yükleyin, arayın ve sonra bitene kadar boşaltın.

Aşağıdaki kodu VB.Net örneği here'dan uyarladım.

[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; 
    } 
İlgili konular