먼저 dllimport 속성과 getProcAddress 함수를 직접 비교하는 것이 적절하지 않다는 것을 알고 있습니다. 오히려, 나는 dllimport 속성을 가진 함수를 가져 오거나 getProcAddress 함수를 사용하여 dll에서 함수를 호출하는 것과 기본적으로 같은 것을 달성하는 코드 두 개를 비교하는 데 관심이 있습니다. 특히, 필자가 작성한 DLL에서 일부 기능을 사용하는 C# 응용 프로그램을 작성하고 있습니다. 처음에 나는 다음과 같은 코드 조각으로 내 DLL 함수에 액세스 :dllimport와 getProcAddress의 차이점
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;
}
}
그러나, 나는 나중에이 DLL을 호출하는 동안 설정 한 경우 lastError 값에 얻을 필요, 그래서 이것으로 내 코드를 변경 :
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이나 다른 함수를 사용하지 않을 첫 번째 공식을 사용하는 이유가 있습니까?
답장을 보내 주셔서 감사합니다. 내 코드에서 실제로 라이브러리를 생성자에로드하고 소멸자에서 라이브러리를 해제 한 다음 라이브러리를 두 번 이상로드하는 데 문제가 있는지 알지 못했기 때문에 전체를 싱글 톤으로 사용했습니다. 정확함을 기하기 위해 도서관을 무료로 내 게시물을 편집했습니다. – Boris
@Boris :'LoadLibrary'와'FreeLibrary'는 카운팅을 참조하기 때문에 여러 콜이 잘 작동하는 경향이 있습니다. –
"누출 주소"란 무엇을 의미합니까? DLL은 한 번만로드되고 함수의 복사본 하나만 메모리에 있고 대리자는 가비지 수집됩니다. –