2009-11-06 48 views
3

後發現了一個解決方案How do I handle a failed DllImport?捕捉DllNotFoundException /調用

我正在寫檢查操作系統版本做取決於主機是否使用Vista的系列或NT不同的事情的應用Windows系列版本。如果是Vista系列,它會加載一些DLL(使用DllImport),但不使用這些。問題是,使用DllImport加載它們會在運行時導致DllNotFoundException,如果在沒有這些DLL的較早版本的Windows上使用它們。

如何捕獲/防止/忽略DllNotFoundExceptions?嘗試在我的未處理的異常事件中將異常設置爲「處理」不允許應用程序繼續。

+0

在呼叫站點或程序加載時(但在您真正嘗試調用這些函數之前)拋出異常嗎? – 2009-11-06 10:29:04

+0

捕捉異常並不理想,因爲應該避免將異常作爲正常應用程序流的一部分。就你而言,在特定的平臺上,每次調用都會首先拋出一個異常,如果可能的話,我會避免這種異常。 – Lucero 2009-11-06 10:52:56

回答

2

我認爲你應該能夠通過win32 LoadLibrary/GetProcAddress/FreeLibrary和一個委託(就像你使用回調函數一樣)使用「傳統」方式。

http://msdn.microsoft.com/en-us/library/d186xcf0.aspx可能是一個起點......

這應該讓你開始:

[DllImport("kernel32.dll", SetLastError=true)] 
public static extern IntPtr LoadLibrary(string lpFileName); 

[DllImport("kernel32.dll", SetLastError=true)] 
static extern bool FreeLibrary(IntPtr hModule); 

[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)] 
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); 

然後你聲明與出口的正確的簽名被稱爲委託,並使用Marshal.GetDelegateForFunctionPointer()來從你從GetProcAddress得到的函數指針創建它。

1

作爲一個選項,你可以在C++/CLI中編寫某種修飾器組件,它將使用LoadLibrary或靜態鏈接將所有調用轉發給windows dll,並手動處理這些dll的缺失。