LoadLibrary 오류 처리 방법
LoadLibrary에 대한 자세한 설명은 따로 했다.
LoadLibrary는 제대로 작동하지 않으면 그 이유를 정수 형태의 에러 메시지로 반환한다. 그러나 이러한 반환을 위해서는 아래와 같이 DllImportAttribute.SetLastError를 true로 설정해야 한다.
[DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr LoadLibrary(string lpLibFileName);
로드가 되지 않으면 Marshal.GetLastWin32Error 메떠드를 이용하여 아래와 같이 원인을 확인한다.
IntPtr intPtr = LoadLibrary(@"일부러 틀린 경로");
int errorCode = Marshal.GetLastWin32Error(); // 126
GetLastWin32Error는 LoadLibrary를 실행한 바로 뒤에 실행해야 하는 거에 유의한다. 아래의 코드는 제대로 작동하지 않아 0을 반환한다.
IntPtr intPtr = LoadLibrary(@"일부러 틀린 경로");
nint handle = LSModule;
Text = handle.ToString();
int errorCode = Marshal.GetLastWin32Error(); // 0
그 이유는 아래와 같다.
The common language runtime can make internal calls to APIs that overwrite the GetLastError maintained by the operating system.
– Marshal.GetLastWin32Error Method
clr이 윈도우즈 api를 호출하여 기껏 윈도우즈가 잡아 놓은 에러 메시지를 덮어쓸 수도 있다는 말이다. 위의 코드에서 ToString()이 바로 이런 경우다. nint handle = LSModule까지는 아무 문제가 없지만 Text = handle.ToString()를 거치면 에러 메시지가 사라진다. 그러므로 GetLastWin32Error는 LoadLibrary 바로 뒤에 실행해야 한다.
.NET provides a run-time environment called the common language runtime that runs the code and provides services that make the development process easier.
– Common Language Runtime (CLR) overview
common language runtime은 자바에 있어서의 java virtual machine이라 보면 된다. .네트라는 플래트폼에서 오퍼래이팅 시스템과 코드 사이에서 여러 처리를 담당한다. 자바는 프로그래밍 언어임과 동시에 .네트와 같은 플래트폼이다.
Oracle Java is the #1 programming language and development platform.
– www.java.com/en/