Во-первых, я знаю, что нет смысла сравнивать атрибут 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 или другую функцию?