출처1 : http://sanaigon.tistory.com/155

출처2 : https://social.msdn.microsoft.com/Forums/vstudio/en-US/cbbf2d61-6824-4b2f-90ea-bce3291c7fc8/what-else-in-order-to-make-setdlldirectory-work-in-a-net-40-app?forum=clr


asp.net 페이지에서 작업중에 C++로 만든 DLL 을 사용해야 하는 이슈가 생겼다. 

기존 사용하던대로 그냥 DllImport 하려고하니 dll 파일을 찾을 수 없다고 나오더라.


관련 내용을 찾다보니 아래와 같은 내용을 찾았다. 


·  프로세스의 현재디렉토리의 상위폴더

·  윈도우 시스템 디렉토리의 상위폴더(, 윈도우 디렉토리)

·  16비트 시스템 디렉토리의 상위폴더

·  윈도우 디렉토리의 상위폴더(일반적으로 볼륨의 루트)

·  PATH환경변수에 포함되어 있는 디렉토리의 상위폴더



이걸로 봤을 때 dll을 가져오는 경로를 잡아주면 될 것 같았고 아래와 같은 소스를 사용하여 해결하였다.



[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]

[return: MarshalAs(UnmanagedType.Bool)]

static extern bool SetDllDirectory(string lpPathName);

 

[DllImport("kernel32", SetLastError = true)]

static extern IntPtr LoadLibrary(string lpFileName);


SetDllDirectory(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "bin\\");



SetDllDirectory 함수를 사용해서 DLL 사용할 경로를 추가해주고 사용하면 된다. 

DllImport 시에 아래와 같이 폴더를 추가해 줄 수도 있다. 


[DllImport("x64\\myModule64.dll", EntryPoint = "myModule_function")]




Posted by motolies
,