7
我正在使用OpenTK OpenGL包裝。由於它加載OpenGL DLL(或Linux上的.so),因此它包含很多DLL導入的函數。如何在不調用函數的情況下檢查DLL入口點是否存在於C#中
問題是,有些驅動程序不會導出所有的功能。有沒有辦法檢查入口點是否存在?我需要這樣做,因爲實際上在系統上調用函數會導致崩潰,如果沒有以正確的順序執行。因此,捕獲EntryPointNotFound異常在我的情況下不起作用。
我正在使用OpenTK OpenGL包裝。由於它加載OpenGL DLL(或Linux上的.so),因此它包含很多DLL導入的函數。如何在不調用函數的情況下檢查DLL入口點是否存在於C#中
問題是,有些驅動程序不會導出所有的功能。有沒有辦法檢查入口點是否存在?我需要這樣做,因爲實際上在系統上調用函數會導致崩潰,如果沒有以正確的順序執行。因此,捕獲EntryPointNotFound異常在我的情況下不起作用。
您可以P/Invoke的LoadLibrary和GetProcAddress的從Win32調用:
[DllImport("kernel32", SetLastError=true)]
static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);
使用LoadLibrary來加載模塊,並獲得句柄,和GetProcAddress獲得函數指針的入口點。如果後者返回錯誤,則入口點不存在。
實際上,您不需要檢查對GetProcAddress調用的錯誤代碼。只需檢查返回值是否爲0。返回值0(這實際上是一個指針)表示沒有導出該名稱的符號。 –