2013-02-15 3 views
4

Visual Studio 2012 (11.0.51106.01 업데이트 1)로 64 비트 Windows 7 상자에서 개발 중입니다..NET에서 "지정된 프로 시저를 찾을 수 없습니다"오류가 발생했습니다.

일부 C 코드를 (32 비트) DLL로 컴파일하는 지원 프로젝트가 있습니다. 내 헤더에서 내가 가진 :

내 C 파일에서
#define RET_TYPE(type) _declspec(dllexport) type __stdcall 

RET_TYPE(int) test_dll_call(int invar); 

내가 가진 :

RET_TYPE(int) test_dll_call(int invar) 
{ 
    int retVal = 4 * invar; 

    return retVal; 
} 

나는 또한 다음과 같이 클래스의 내부 DLL을로드하는 (32 비트)의 WPF C# 응용 프로그램이 있습니다 다음과 같이

[DllImport("MyDll.dll", CharSet = CharSet.Ansi, BestFitMapping = true, ThrowOnUnmappableChar = true)] 
public static extern int test_dll_call(int invar); 

는 싸여있다 :

public void Wrap_TestDllCall() 
{ 
    try 
    { 
     int outTest = 0; 
     int invar = 3; 

     outTest = test_dll_call(invar); 
    } 
    catch (Exception ex) 
    { 
     dllError = ex.ToString(); 
    } 
} 

이것을 개발 상자의 디버거에서 실행하면 정상적으로 작동합니다. 모든 관련 파일을 별도의 폴더에 복사하고 거기에서 실행하면 정상적으로 작동합니다.

내가 32 비트 Windows XP SP3 나는 다음과 같은 오류 얻을 실행하는 다른 컴퓨터에 필요한 모든 폴더를 복사하는 경우 :

System.DllNotFoundException: Unable to load DLL 'MyDll.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007F) 
    at MyNamespace.MyClass.test_dll_call(Int32 invar) 
    at MyNamespace.MyClass.Wrap_TestDllCall() 

내가 내 컴파일 된 EXE와 DLL 모두에 종속 워커를 사용했다가, 발견 한 누락 된 DLL은 wer.dllieshims.dll 뿐이므로 내 연구에서는 XP에 필요하지 않습니다.

VS2012 C++ 재배포 가능 파일과 .NET 4 및 .NET 4.0.3 업데이트를 설치했습니다. 아직도 운이 없다.

이 앱이 DLL의 절차를 찾을 수 없습니다로 나타납니다 편집 한스가 지적 하듯이; 나는 또한 시도 :

[DllImport("MyDll.dll", CallingConvention=CallingConvention.Cdecl)] 
public static extern int test_dll_call(int invar); 

또한 내 dev에 상자에서 잘 작동하지만 WINXP 상자에서 같은 오류를 제공

__declspec(dllexport) int __cdecl test_dll_call(int invar); 

합니다.

도움말!

+0

누락 된 DLL에 대해 불평하지 않고 DLL에서 "test_dll_call"함수를 찾을 수 없습니다. 잘못된 DLL을 복사 한 것 외에도 잘못 될 수있는 방법은 거의 없습니다. –

+2

좋아요, 그럼 그 다른 방법은 뭔가요? 내 dev 상자에서 작동하지만 내 WinXP 테스트 랩탑에서는 작동하지 않습니다. –

답변

6

문제가 해결되었습니다. 앞으로 문제가되는 사람들을 위해 문제 해결 단계를 진행할 때주의해야 할 몇 가지 사항이 있습니다.

  1. 이 오류는 반드시이 절차 X을 찾을 수없는 것을 의미하지 않는다 - 오히려 그것은 다른 DLL에서 함수 Y을 찾을 수없는 의미, 그는 X에 의해 호출됩니다.
  2. C++ 재배포 가능 파일에 디버그 DLL이 포함되지 않으므로 '릴리스'모드에서 DLL을 컴파일해야합니다.
  3. 쉘 기능으로 시작하여 조각을 하나씩 다시 추가하십시오.

위의 테스트 예제에서 문제는 디버그 버전으로 컴파일하는 것이 었습니다.

그러나 전체 기능에서 변경으로 문제가 해결되지 않았습니다. 종속성 워커가 포착하지 못한 일부 DLL이 누락되었습니다.

관련 문제