내 .NET 4.0 응용 프로그램에서 사용해야하는 관리되지 않는 C ++ API 코드가있는 dll 라이브러리가 있습니다. 하지만 내 DLL을로드하려고하는 모든 방법에 오류가 발생합니다.
DLL ‘MyOwn.dll’을로드 할 수 없습니다 : 지정된 모듈을 찾을 수 없습니다. (HRESULT 예외 : 0x8007007E)
나는 인터넷에서 찾은 severa 솔루션을 읽고 시도했습니다. 작동하지 않습니다 ..
다음 방법을 사용해 보았습니다.
[DllImport("MyOwn.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs((UnmanagedType.I4))]
public static extern Int32 MyProIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
이 기사를 따르고이 예제를 실행하면 (다운로드 한 코드에서) 문제없이 실행됩니다 (사용 된 dll은 bin / debug 폴더에 있음).
내 dll을 복사했습니다 (모든 파일과 함께 내 bin 폴더에 의존합니다).
나는 또한이 접근 방식을 시도했지만 동일한 오류가 발생했습니다.
[DllImportAttribute(MyOwnLibDllPath, EntryPoint="TMproIni")]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int MyproIni(string DBname, string DBuser_pass,
string WorkDirectory, ref StringBuilder ErrorMessage);
어떤 제안?
답변
Windows에서 기억하는 dll 검색 순서는 다음과 같습니다.
- 현재 디렉토리
- 시스템 폴더
C:\windows\system32 or c:\windows\SysWOW64
(64 비트 상자의 32 비트 프로세스 용). Path
환경 변수 에서 읽기
또한 DLL의 종속성을 확인하고 Visual Studio와 함께 제공되는 종속성 워커가 여기에서 도움을 줄 수 있으며 무료로 다운로드 할 수도 있습니다. http://www.dependencywalker.com
답변
dumpbin 도구를 사용하여 필요한 DLL 종속성을 찾을 수 있습니다.
dumpbin /DEPENDENTS my.dll
이렇게하면 DLL이로드해야하는 DLL을 알 수 있습니다. 특히 MSVCR * .dll을 찾으십시오. 올바른 Visual C ++ 재배포 가능 패키지가 설치되지 않았을 때 오류 코드가 발생하는 것을 보았습니다.
Microsoft 웹 사이트에서 “Visual Studio 2013 용 Visual C ++ 재배포 가능 패키지”를 얻을 수 있습니다. c : \ windows \ system32 \ MSVCR120.dll을 설치합니다.
파일 이름에서 120 = 12.0 = Visual Studio 2013입니다.
DLL의 대상 플랫폼에 적합한 Visual Studio 버전 (10.0 = VS 10, 11 = VS 2012, 12.0 = VS 2013 …)이 올바른 아키텍처 (x64 또는 x86)인지 확인하고주의해야합니다. 디버그 빌드. DLL의 디버그 빌드는 재배포 가능 패키지가 아닌 Visual Studio와 함께 설치되는 라이브러리의 디버그 버전 인 MSVCR120d.dll에 의존합니다.
답변
이것은 ‘kludge’ 이지만 적어도 온전한 테스트에 사용할 수 있습니다. 코드에서 DLL 경로를 하드 코딩 해보십시오.
[DllImport(@"C:\\mycompany\\MyDLL.dll")]
라고 한; 제 경우에는 dumpbin /DEPENDENTS
@ anthony-hayward가 제안한대로 실행 하고 32 비트 이상 복사 거기에 나열된 버전의 DLL을 제 작업 디렉토리에 하면이 문제가 해결되었습니다.
로드 할 수없는 “내”dll이 아니기 때문에 메시지는 약간 오해의 소지가 있습니다.
답변
DLL은 bin 폴더에 있어야합니다.
Visual Studio에서 dll을 내 프로젝트에 추가합니다 (참조에는 없지만 “기존 파일 추가”). 그런 다음 “Copy to Output Directory”속성을 “Copy if newer”로 설정합니다.
답변
dll의 전체 경로를 입력하십시오. 작동하지 않으면 dll을 system32 폴더에 복사 해보십시오.
답변
자체 dll의 모든 종속성이 dll 근처 또는 System32
.
답변
당신의 시간을 낭비 할 수있는 아주 재미있는 일이 하나 있습니다.
콘솔 애플리케이션 프로젝트 ConsoleApplication1
와 클래스 라이브러리 프로젝트를 만들었습니다.ClassLibrary1
.
p / invoke를 만드는 모든 코드는 ClassLibrary1.dll
. 따라서 Visual Studio에서 응용 프로그램을 디버깅하기 전에 C ++ 관리되지 않는 어셈블리 ( myUnmanagedFunctions.dll
)를 다음 \bin\debug\
디렉터리에 복사했습니다.ClassLibrary1
CLR에서 런타임에로드 할 수 있도록 프로젝트 했습니다.
나는 계속
DLL을로드 할 수 없습니다.
몇 시간 동안 오류. 나중에로드 할 관리되지 않는 모든 어셈블리를 \bin\debug
시작 프로젝트 의 디렉터리에 복사해야한다는 것을 깨달았 습니다.ConsoleApplication1
일반적으로 win 폼, 콘솔 또는 웹 응용 프로그램 인 .
따라서 Current Directory
수락 된 답변에서 실제로 Current Directory
응용 프로그램 프로세스가 시작되는 주 실행 파일을 의미 합니다. 명백한 것처럼 보이지만 때로는 그렇지 않을 수도 있습니다.
학습 한 내용 -항상 관리되지 않는 dll을 시작 실행 파일과 동일한 디렉토리에 두어 찾을 수 있는지 확인하십시오.