2017-11-17 6 views
0

저는 API DLL이 다른 디렉토리의 파일에 대한 작업을 수행하는 데 사용되는 프로젝트를 공유하는 두 개의 프로그램을 보유하고 있습니다. 내가 가진 문제는이 코드는 하나 개의 프로젝트에서 작동하지만 다른에서 실패 : 이전에이 명시 적으로 연결된 DLL 대리자가 한 프로그램에서 성공하지만 다른 프로그램에서는 성공하지 않는 이유는 무엇입니까?

moduleHandle = LoadLibrary(“api.dll”) 

, 프로세스 모니터 로그를 비교 한 후, 그래서 여기에 API의 DLL로의 연결에 실패 실패 프로그램을 둘 다 일부 DLL을 같은 디렉토리에 복사했습니다. 그런 다음 성공했으며 moduleHandle의 값은 이제 두 프로그램에서 동일합니다. 다음 : 우리가 delegateForSomeFunction에 도착했을 때, 나는 그들에 _methodPtr의 값이 하나 개의 프로그램에서 다른 다른 것을 볼 수 있습니다

methodPointer = GetProcAddress(moduleHandle, "NameOfSomeFunction") 
delegateForSomeFunction = Marshal.GetDelegateForFunctionPointer(methodPointer, GetType(SomeFunctionType)) 

. 그런 다음 대리인을 호출 할 때 :

Dim argsArray() As Object = New Object() {directoryPath, errorFilePath}   
Dim retVal As Short = delegateForSomeFunction.DynamicInvoke(argsArray) 

한 프로그램에서이 메시지는 자동으로 실패합니다. 계속 진행하는 방법에 관해서는 약간의 손실이 있습니다. 더 자세히 조사하려면 어떻게해야하며 어떻게 작동시킬 수 있습니까?

나는 비주얼 스튜디오 2013에서 디버그에서이 작업을 실행 해요, 그리고 API의 DLL의 같은 디렉토리에 WinSxS에의 의존성의 올바른 버전을 복사하는 것은에 저를 허용 않았지만이 프로젝트는 .NET 4

답변

0

에 명백한 오류없이 LoadLibrary를 수행하면 백그라운드에서 더 많은 오류가 발생합니다.

문제는 결국 매니페스트에있었습니다. post-build 이벤트를 통해 배포 단계 준비를 위해 .exe의 매니페스트를 제거하여 다른 버전의 API를 지정할 수있었습니다. 정상적으로로드에 실패한 종속 어셈블리를 지정하고 적절한 .exe .manifest 파일을 작성한 다음 이것을 .exe와 동일한 디렉토리에 배치하면 문제가 해결됩니다.