2011-06-23 18 views
7

私はバグのあるサードパーティのDLLファイルを持っており、しばらくしてからアクセス違反の例外がスローされます。それが起こると、そのDLLファイルをリロードします。それ、どうやったら出来るの?ネイティブDLLファイルを動的にロードおよびアンロードする方法は?

+2

どのように全体のプロセスを代行プロセスにDLLをロードし、終了についてはどうですか?通常、プロセスはアクセス違反の後に壊れたとみなされます。 – CodesInChaos

+0

これを行うには? AppDomainsについてはほとんど聞きませんでした。いくつかの例を投稿していただけますか? – Poma

+1

それは、AppDomainsがネイティブのDLLだから助けにならないでしょう。 dllをロードし、プロセス間の通話を転送するために、あるプロセス間の通信形式を使用する2番目のプロセスが必要です。 .netリモーティングは1つの方法かもしれません。しかし、私はそれを自分でやっていません。 – 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); 

あなたは介して通信ワーカープロセスを作成します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

そして私のdll関数を呼び出す方法は? 「DllImport」と宣言すると、このアプローチはうまくいきません – Poma

+1

これを解決しましたか? ネイティブコードのいくつかのコードスニペットを提供できますか?どのようにネイティブコードを宣言し、デリゲートはどのように見えるのでしょうか?ありがとう – freshWoWer

+0

@Pomaあなたはこれを稼働させましたか? GetDelegateForFunctionPointerを動作させる方法を教えてください。 – GuidoG

0

を使用し、最初のあなたは、この機能 に一致するdelegeateを作成する必要があります関数を呼び出すとしたい場合はCOMか別のIPCメカニズムその後、DLLが消えたら、ワーカープロセスを再起動することができます。

0

dllを読み込んで呼び出し、それがなくなるまでアンロードします。

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; 
    } 
関連する問題