首先,我知道直接比较 dllimport 属性和 getProcAddress 函数是没有意义的。相反,我有兴趣比较两段代码,它们基本上实现了相同的事情——调用 dll 中的函数——通过使用 dllimport 属性或 getProcAddress 函数导入函数。具体来说,我正在编写一个 C# 应用程序,它使用我编写的 dll 中的某些函数。起初,我使用以下代码访问了我的 dll 函数:
class DllAccess
{
[DllImport("kernel32.dll", SetLastError = true)]
private extern IntPtr LoadLibrary(String DllName);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate Bool BarType(Byte arg); // return value indicates whether function call went well or not.
Bool Bar(Byte arg)
{
Bool ok = false;
IntPtr pDll= LoadLibrary("foo.dll");
if (pDll != IntPtr.Zero)
{
IntPtr pfunc = GetProcAddress(pDll, "bar");
if (pFunc != IntPtr.Zero)
{
BarType bar = (BarType)Marshal.GetDelegateForFunctionPointer(pFunc, typeof(BarType));
ok = bar(arg);
}
FreeLibrary(pDll);
}
return ok;
}
}
但是,我后来需要获取 lastError 值,如果它是在 dll 调用期间设置的,所以我将代码更改为:
class DllAccess
{
[DllImport("foo.dll", EntryPoint = "bar", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private extern Bool DllBar(Byte arg); // return value indicates whether function call went well or not.
Bool Bar(Byte arg)
{
return DllBar(arg);
}
}
这当然更整洁,并且如前所述,它设置了 lastError 代码。显然,我的第一段代码让我可以在运行时更改 dll 和函数调用,但目前这不是必需的。所以我的问题是:如果我确定我不会使用另一个 dll 或另一个函数,是否有任何理由使用第一个公式?