[c#] 경로가 맞는데도 LoadLibrary가 126을 반환하고 실행되지 않는 문제
아래의 코드는 0을 반환해야 하지만 126을 반환하는 경우도 있다.
[DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr LoadLibrary(string lpLibFileName);
private void Form1_Load(object sender, EventArgs e)
{
string path = @"C:\TestPath\test.dll";
if (File.Exists(path))
{
IntPtr intPtr = LoadLibrary(path);
Text = Marshal.GetLastWin32Error().ToString(); // 126
}
}
LoadLibrary가 파일을 찾지 못하면 GetLastWin32Error는 126을 반환한다. 그러나 File.Exists(path)로 확인을 한 상태이므로 126을 반환해서는 안 된다.
이 문제에 대해 검색을 해 보면 dependency가 어쩌구 하며 여러 설명들이 나오지만 내가 보기엔 그저 버그다. 같은 코드가 어떤 컴퓨터에서는 0을 반환하고 다른 거에서는 126을 반환하기도 하며 후자의 경우에도 정적으로 로드하면 0을 반환하기도 하기 때문이다.
아래의 코드로 해결된다.
[DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr LoadLibrary(string lpLibFileName);
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string lpPathName);
private void Form1_Load(object sender, EventArgs e)
{
SetDllDirectory(@"C:\TestPath");
string path = @"C:\TestPath\test.dll";
if (File.Exists(path))
{
IntPtr intPtr = LoadLibrary(path);
Text = Marshal.GetLastWin32Error().ToString(); // 0
}
}
SetDllDirectory는 말 그대로 디렉토리를 설정하는 거라 파일 이름이 아닌 폴더 이름으로 끝나야 하는 거에 주의한다.