如何在不调用函数的情况下检查C#中是否存在DLL入口点

Lat*_*fer 9 c# pinvoke

我正在使用OpenTK OpenGL包装器.由于它加载OpenGL DLL(或Linux上的.so),它包含许多DLL导入函数.

麻烦的是,一些驱动程序不会导出所有功能.有没有办法检查入口点是否存在?我需要这样做,因为实际调用具有它的系统上的函数如果没有以正确的顺序完成将导致崩溃.所以捕获EntryPointNotFound异常在我的情况下不起作用.

Kev*_*Hsu 10

您可以从Win32 P/Invoke LoadLibrary和GetProcAddress调用:

[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);
Run Code Online (Sandbox Code Playgroud)

使用LoadLibrary加载模块并获取句柄,使用GetProcAddress获取指向入口点的函数指针.如果后者返回错误,则入口点不存在.

  • 实际上,您不需要在调用GetProcAddress时检查错误代码.只需检查返回值是否为0.返回值0(实际上是指针)表示没有导出该名称的符号. (2认同)