DLL을로드 할 수 없습니다 (모듈을 찾을 수 없음 HRESULT : 0x8007007E).


113

내 .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);

어떤 제안?

답변:


90

Windows에서 기억하는 dll 검색 순서는 다음과 같습니다.

  1. 현재 디렉토리
  2. 시스템 폴더 C:\windows\system32 or c:\windows\SysWOW64(64 비트 상자의 32 비트 프로세스 용).
  3. Path환경 변수 에서 읽기

또한 DLL의 종속성을 확인하고 Visual Studio와 함께 제공되는 종속성 워커가 여기에서 도움을 줄 수 있으며 무료로 다운로드 할 수도 있습니다. http://www.dependencywalker.com


4
일부 종속성이 누락되었습니다 (Oracle 및 IE의 일부 dll). 내 DLL 이후 오라클을 설치해야 내가 알 that..then에 따라 달라집니다 : DependencyWalker의 문제를 찾을 수)
Ingimar Andresson에게

걱정하지 마세요. 머리를 긁는 데 많은 시간이 절약되었습니다. :-)
display101

1
DependencyWalker를 제안한 Keith Halligan에게 +1. 모든 종속성이 동일한 CPU 유형 (x86 / x64)을 갖는 것은 아니라고 말했습니다. 동일한 CPU 유형을 가진 모든 파일을 내 응용 프로그램의 bin 폴더에 복사하여 문제가 해결되었습니다.
DiligentKarma

6
내 시스템에서 찾을 수있는 모든 dll에는 다른 CPU 유형 (System.Web.Mvc.dll까지 포함)에 오류가 있다고 주장하는 DependencyWalker가 있습니다. 여기에 일종의 잘못된 경보가 있습니다.
PandaWood

2
제 경우에는 문제가 디버그 용으로 컴파일 된 C ++ DLL을로드하려고했습니다. C ++ 디버그 런타임이 필요하므로 Visual Studio를 설치해야합니다. 또는 릴리스 용 DLL을 다시 컴파일하고 배포 가능한 C ++ 런타임을 설치합니다.
RenniePet 2014

42

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에 의존합니다.


5
VS C ++ 재배포 가능 항목을 추가하는 것이 저를위한 것이 었습니다! v10.0 (2010)이 필요합니다. 감사합니다 !!
Thiago Silva

재배포 가능 파일의 64 비트 또는 32 비트 버전이 필요한지 여부를 알 수있는 방법이 있습니까?
BVB

1
DUMPBIN / ALL은 my.dll는 64의 86인지 여부를 알려줍니다
앤서니 헤이워드

1
여전히이 문제를 겪고있는 사람들을 위해 debug바이너리 를 사용한다면 C ++ 런타임 재배포 가능 버전은 빌드 한 위치와 정확히 동일해야합니다.
skyline75489

@ skyline75489 님의 댓글이 나를 위해 하루를 저장했습니다. C ++ 라이브러리는 내 컴퓨터에서 잘 작동했지만 VS가 msvcr의 디버그 버전에 연결하기 때문에 다른 곳에서로드하지 못했습니다.
스파이

14

이것은 'kludge' 이지만 적어도 온전한 테스트에 사용할 수 있습니다. 코드에서 DLL 경로를 하드 코딩 해보십시오.

[DllImport(@"C:\\mycompany\\MyDLL.dll")]

라고 한; 제 경우에는 dumpbin /DEPENDENTS@ anthony-hayward가 제안한대로 실행 하고 32 비트 이상 복사 거기에 나열된 버전의 DLL을 제 작업 디렉토리에 하면이 문제가 해결되었습니다.

로드 할 수없는 "내"dll이 아니기 때문에 메시지는 약간 오해의 소지가 있습니다.


12

DLL은 bin 폴더에 있어야합니다.

Visual Studio에서 dll을 내 프로젝트에 추가합니다 (참조에는 없지만 "기존 파일 추가"). 그런 다음 "Copy to Output Directory"속성을 "Copy if newer"로 설정합니다.




4

당신의 시간을 낭비 할 수있는 아주 재미있는 일이 하나 있습니다.

콘솔 애플리케이션 프로젝트 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을 시작 실행 파일과 동일한 디렉토리에 두어 찾을 수 있는지 확인하십시오.


이것은 나에게도 문제를 해결했습니다. 종류 이상한 느낌이 ...하지만, 그들을 사용하는 대신 실제의 프로젝트의 주요 프로젝트에 DLL을 넣어
숀 더간

@SeanDuggan은 "동적 연결 라이브러리"이기 때문에 연결시 사용되는 정적 라이브러리와 달리 런타임에 사용 (로드)된다는 의미입니다.
m4l490n

나는에 DLL을 추가 시도 bin\Debug하고 obj\Debug디렉토리를하고 난 "DLL로드 할 수 없습니다"가 계속
m4l490n

3

퓨전 로깅을 켜고 이를 수행하는 방법에 대한 많은 조언을 보려면 이 질문 을 참조하십시오 . 혼합 모드 앱 로딩 문제를 디버깅하는 것은 왕실의 고통이 될 수 있습니다. 융합 로깅은 큰 도움이 될 수 있습니다.


2

빌드 플랫폼 대상을 x86 또는 x64로 설정하여 32 비트 플랫폼 용으로 컴파일 될 수있는 DLL과 호환되도록하십시오.


2

DLL과 .NET 프로젝트가 동일한 솔루션에 있고 매번 둘 다 컴파일하고 실행하려면 .NET 프로젝트, 빌드 이벤트의 속성을 마우스 오른쪽 단추로 클릭 한 다음 빌드 후 이벤트에 다음과 같은 항목을 추가 할 수 있습니다. 명령 줄 :

copy $(SolutionDir)Debug\MyOwn.dll .

기본적으로 DOS 라인이며 DLL이 빌드되는 위치에 따라 조정할 수 있습니다.


2

PC를 테스트하기 위해 응용 프로그램을 배포 할 때 동일한 문제가 발생했습니다. 문제는 개발 PC가 가지고 msvcp110d.dll있었고msvcr110d.dll 있지만 테스트 PC를.

InstalledSheild에 "Visual Studio C ++ 11.0 DebugCRT (x86)"병합 모듈을 추가했는데 제대로 작동했습니다. 이것이 다른 사람에게 도움이되기를 바랍니다.


2

제 경우에는 하나의 관리되지 않는 dll이 누락 된 다른 dll에 의존했습니다. 이 경우 오류는 실제로 혼란 스러울 수있는 누락 된 dll 대신 기존 dll을 가리 킵니다.

그것이 바로 제 경우에 일어난 일입니다. 이것이 다른 사람에게 도움이되기를 바랍니다.


1

관리되지 않는 라이브러리에 매니페스트가 필요하다고 생각합니다. 바이너리에 추가하는 방법은
다음과 같습니다 . 그리고 여기 에 이유가 있습니다.

요약하면 여러 재배포 가능 라이브러리 버전을 상자에 설치할 수 있지만 그중 하나만 앱을 충족해야하며 기본값이 아닐 수 있으므로 라이브러리에 필요한 버전을 시스템에 알려야하므로 매니페스트가 필요합니다.


1

설정 : 32 비트 Windows 7

컨텍스트 : 앞서 언급 한 문제로 인해 통신 할 수없는 PCI-GPIB 드라이버를 설치했습니다.

짧은 답변 : 드라이버를 다시 설치하십시오.

긴 답변 : 또한 몇 가지 누락 된 종속성 모듈을 식별 하는 Dependency Walker를 사용했습니다 . 즉시 드라이버 설치가 잘못되었다고 생각했습니다. 누락 된 각 파일을 확인하고 복원하고 싶지 않았습니다.

제어판의 프로그램 및 기능에서 제거 프로그램을 찾을 수 없다는 사실은 잘못된 설치의 또 다른 표시입니다. 드라이버 재설치를 위해 \ system32와 레지스트리 키에서 * .dll 몇 개를 수동으로 삭제해야했습니다.

문제가 해결되었습니다.

예상치 못한 부분은 모든 종속성 모듈이 해결되지 않았다는 것입니다. 그럼에도 불구하고 이제 관심있는 * .dll을 참조 할 수 있습니다.


1

같은 문제가 발생했습니다. 제 경우에는 두 개의 32 비트 PC가있었습니다. 하나는 .NET4.5가 설치된 것이고 다른 하나는 새로운 PC였습니다.

내 32 비트 cpp dll (릴리스 모드 빌드)이 .NET이 설치된 PC에서는 제대로 작동했지만 아래 오류가 발생한 새 PC에서는 작동하지 않았습니다.

DLL 'PrinterSettings.dll'을로드 할 수 없습니다 : 지정된 모듈을 찾을 수 없습니다. (HRESULT 예외 : 0x8007007E)

드디어,

방금 디버그 모드 구성 에서 프로젝트를 빌드했으며 이번에는 cpp dll이 제대로 작동했습니다.


0

또한 C # 환경에서 관리되지 않는 c / c ++ dll 파일을 사용할 때 동일한 문제에 직면했습니다.

1. 32 비트 또는 64 비트 CPU와 dll의 호환성을 확인했습니다.

2. DLL .bin 폴더, system32 / sysWOW64 또는 지정된 경로의 올바른 경로를 확인했습니다.

PDB (프로그램 데이터베이스) 파일 missing.This 경우 3.Checked 비디오 는 pdb 파일에 대해 가장 잘 이해하고 있습니다.

64 비트 시스템에서 32 비트 C / C ++ 바이너리 코드를 실행할 때 플랫폼 비 호환성으로 인해 이러한 문제가 발생할 수 있습니다. 빌드> 구성 관리자에서 변경할 수 있습니다.


0

.Net Framework +4에서 C ++ Dll을 가져올 때 동일한 문제에 직면했고 Project-> Properties-> Build-> Prefer 32-bit를 선택 취소했으며 저를 위해 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.