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