2010-05-28 3 views
3

Visual Studio에서 클래스 라이브러리 프로젝트를 사용하여 C++에서 dll을 만들었습니다. C# 응용 프로그램에서 dll 메서드를 호출해야합니다.C# Windows 응용 프로그램 프로젝트에서 C++ dll을 호출하는 방법

나는 2 개의 approches가 있다는 것을 알게되었다. 하나는 C# 프로젝트에 dll 프로젝트 참조를 추가하거나 DllExport를 사용하여 메서드를 내보내는 것입니다. 그러나 두 가지 방법으로 시도한 경우 런타임에 dll 메서드가 호출 될 때 항상 다음 오류가 발생합니다.

'System.BadImageFormatException'형식의 처리되지 않은 예외가 TestClient.exe에서 발생했습니다. 추가 정보 : 잘못된 형식의 프로그램을로드하려고했습니다. (HRESULT 예외 : 0x8007000B)

이 문제를 방지하는 방법을 알고 있습니까?

미리 감사드립니다.

+0

결과 (예외)를 게시했지만 원인 (소스 코드)은 게시하지 않았습니다. –

답변

5

이 오류는 32 비트 DLL을 64 비트 프로세스에로드하거나 64 비트 DLL을 32 비트 프로세스로로드하려고한다는 것을 의미합니다. Windows에서 DLL의 비트는 올바르게로드되기 위해 프로세스의 비트 수와 일치해야합니다.

네이티브 DLL은 32 비트 또는 64 비트입니까? C# 프로젝트 빌드 설정에서 어떤 플랫폼을 타겟팅합니까? C# 프로젝트 속성을 사용하는 경우 빌드 탭으로 이동하여 "플랫폼 대상"을 기본 DLL이 빌드 된 플랫폼과 일치하도록 x86 또는 x64와 같은 특정 항목으로 변경할 수 있습니다.

다른 대안은 C# 응용 프로그램의 플랫폼과 일치하도록 기본 DLL을 작성하는 것입니다. C# 응용 프로그램의 플랫폼이 AnyCPU 인 경우 32 비트 Windows에서는 32 비트로, 64 비트 Windows에서는 64 비트로 실행됩니다. 이 때문에 32 비트 및 64 비트 버전의 네이티브 DLL이 모두 필요합니다.

C# 응용 프로그램의 플랫폼을 특정 (x86, x64) 버전으로 설정 한 다음 기본 DLL 플랫폼을 변경하여 변경하는 것이 좋습니다.

+0

64 비트 시스템을 사용 중입니다. 그러나 모든 프로젝트는 32 비트 플랫폼에 있으며 심지어 "Win 32"가 아닌 C++ dll 프로젝트에서 플랫폼 대상을 변경할 수 없습니다. C# 프로젝트 속성에서도 빌드 대상은 "모든 CPU"로만 설정할 수 있습니다. 그러나 C# 웹 서비스에서 dll 메서드에 액세스했습니다. C# Windows 응용 프로그램을 사용할 때이 문제가 발생했습니다. – chathuradd

+0

AnyCPU에서 C# 프로젝트를 변경할 수없는 이유는 무엇입니까? 어떤 종류의 프로젝트입니까? 64 비트 시스템의 AnyCPU 프로젝트는 64 비트로 실행됩니다. Win32 (32 비트) C++ DLL을로드하려고하면 예외없이 실패합니다. C# 프로젝트를 x86으로 변경하거나 C++ DLL 프로젝트를 x64로 변경해야합니다. –

+0

죄송합니다. 나는 그것이 보이는 틀린 장소를 들여다 보았다. 예, C#에서 x86 플랫폼을 변경할 수 있으므로 예외가 발생하지 않습니다. 고마워 ^^ – chathuradd

관련 문제