2011-06-23 15 views
7

मेरे पास एक छोटी सी पार्टी डीएलएल फाइलें हैं जो निष्पादन के कुछ समय बाद पहुंच उल्लंघन अपवादों को फेंकना शुरू कर देती हैं। जब ऐसा होता है तो मैं उस डीएलएल फ़ाइल को फिर से लोड करना चाहता हूं। मैं उसको कैसे करू?एक मूल DLL फ़ाइल को गतिशील रूप से लोड और अनलोड कैसे करें?

+2

कैसे एक प्रॉक्सी प्रक्रिया में dll लोड और पूरी प्रक्रिया को समाप्त के बारे में? आमतौर पर पहुंच उल्लंघन के बाद एक प्रक्रिया को तोड़ दिया जाता है। – CodesInChaos

+0

यह कैसे करें? मैंने AppDomains के बारे में बहुत कुछ सुना। क्या आप कुछ उदाहरण पोस्ट कर सकते हैं? – Poma

+1

चूंकि यह एक देशी डीएल है AppDomains आपकी मदद नहीं करेगा। आपको दूसरी प्रक्रिया की आवश्यकता है जो डीएलएल लोड करता है और फिर प्रक्रियाओं के बीच कॉल स्थानांतरित करने के लिए इंटर प्रोसेस संचार के कुछ रूपों का उपयोग करता है। .NET remoting एक तरीका हो सकता है। लेकिन मैंने खुद ऐसा नहीं किया है। – CodesInChaos

उत्तर

19

प्रयास करें इस

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

आप कार्यों फोन पहले आप delegeate इस समारोह से मेल खाता है कि बनाना होगा और फिर 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

और मेरे डीएलएल कार्यों को कैसे कॉल करें? जब मैं उन्हें 'DllImport' के रूप में घोषित करता हूं तो यह दृष्टिकोण – Poma

+1

पर काम नहीं करता है क्या आपने इसे हल किया? क्या आप मूल कोड के कुछ कोड स्निपइप प्रदान कर सकते हैं? देशी कोड को कैसे घोषित किया जाना चाहिए और प्रतिनिधि कैसे दिखता है? धन्यवाद – freshWoWer

+0

@Poma क्या आपको यह काम मिल गया? क्या आप कृपया मुझे बता सकते हैं कि GetDelegateForFunctionPointer कैसे काम कर रहा है? – GuidoG

0

उपयोग करना चाहते हैं एक कार्यकर्ता प्रक्रिया है कि के माध्यम से संचार बनाएं कॉम या एक और आईपीसी तंत्र। फिर जब डीएलएल मर जाता है, तो आप केवल कार्यकर्ता प्रक्रिया को पुनरारंभ कर सकते हैं।

0

डीएलएल लोड करें, इसे कॉल करें, और फिर इसे समाप्त होने तक इसे अनलोड करें।

मैंने निम्नलिखित कोड को 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; 
    } 
संबंधित मुद्दे