2009-07-12 4 views
4

XP에서 Vista로 이동 한 직후에 C# 프로그램이 작동하지 않는다는 것을 깨달았습니다.Vista x64에서 LoadLibrary가 실패합니다.

이것은 상황입니다. 저는 C# 응용 프로그램에서 사용하는 C++ DLL을 작성했습니다.이 DLL은 XP에서는 잘 작동했지만 Vista로 옮길 때 C#에서는 작동하지 않습니다.

델파이로 테스트 해 보았지만 정상적으로 작동하지만 C# - 아니오.

나는 C#에서 쉽게 확인하기 위해 추가 코드를 작성했다.

 if (LoadLibrary("blowfish.dll") == 0) 
     { 
      Misc.LogToFile("error", true); 
      Application.Exit(); 
     } 

그것의 라이브러리로 컴파일 때문에, C++ 런타임을 필요로하지 않는다 그것은 C# .NET을 비스타에서 델파이로 작동하지만,하지.

어디에서 문제가 발생할 수 있습니까?

미리 감사드립니다.

+1

이 Vista x86 또는 x64입니까? –

+0

Vista x64.The dll은 x32 용으로 컴파일됩니다. –

+0

그게 문제니까? –

답변

11

x64 플랫폼에서 JIT는 네이티브 C++을 x86으로 컴파일하므로 프로그램을 x64로 컴파일하지 못합니다.
명시 적 86로 프로그램을 컴파일하는 JIT 말할 필요 이, 당신이 86에 CPU 유형을 설정 CorFlags 또는 프로젝트 설정을 사용하여

+0

고마워요,이게 내 문제를 해결했습니다! –

2

셰이가 빠른 수정이 있습니다 (빌드/플랫폼 대상에서) 할 수 - 있도록 전체 응용 프로그램 32 비트 그래서 WOW64에서 실행됩니다.

그러나 "더 나은"솔루션은 전체 프로그램이 기본적으로 64 비트 OS에서 실행될 수 있도록 C++ dll을 64 비트 코드로 다시 작성하는 것입니다.

1

평상시에 컴파일하면 CLR은 64 비트 Windows에서 64 비트 및 x86 Windows에서 32 비트로 응용 프로그램을 실행합니다. 플랫폼에 맞는 올바른 기본 이미지를로드해야합니다. 한 가지 해결책은 Shay가 32 비트 CLR에서 앱을 실행하도록 권장하고 강제 실행하는 것입니다.

응용 프로그램에서 기본 포인터 크기를보고 올바른 기본 이미지를로드 할 수도 있습니다.

string blowfishdll = "blowfish.dll"; 
// detect 64-bit installations by looking at the native pointer size 
if(64 == IntPtr.Size * 8 ) 
    blowfishdll = "blowfish-x64.dll" 

if (LoadLibrary(blowfishdll) == 0)   
{ 
    Misc.LogToFile("error", true);    
    Application.Exit();   
} 
관련 문제