2012-07-24 1 views
5

가능한 중복 링크 : 나는 모든 CPU .NET 프로젝트를 컴파일하기 위해 노력하고있어
Loading x86 or x64 assembly.NET의 anycpu를 프로젝트는 플랫폼 특정 라이브러리를

을,하지만 난이 SQLite는 라이브러리를 연결해야 다른 버전의 x86 및 x64 플랫폼 DLL 버전 만 x64로 변경하면 응용 프로그램이 시작되지 않고 x64 참조를 사용하여 코드를 다시 컴파일해야합니다. x86 및 x64 참조를 모두 추가하면 충돌 때문에 컴파일이 실패합니다. 사용중인 시스템 COM 라이브러리 중 하나가 WOW64에서 작동하지 않기 때문에 x86을 사용하여 응용 프로그램을 컴파일 할 수 없습니다.

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/eadf5dcd-fbd1-4224-9a56-b5843efebb15/

All 32-bit VSS applications (requesters, providers, and writers) must run as native 32-bit or 64-bit applications. Running them under WOW64 is not supported

는 그래서 모든 CPU 프로젝트를 구축해야합니다,하지만 난 그 순간에 볼이 문제에 대한 유일한 해결책은 x86 및 x64에 대한 중복 프로젝트를 가지고있다. 더 좋은 점이 있습니까?

UPDATE

내가 프로젝트의 x64 라이브러리를 참조하지만, 86 라이브러리 나는 다음과 같은 예외가로드하려고합니다.

The located assembly's manifest definition does not match the assembly reference.

+0

감사합니다. 나는 그런 게시물을 보았지만, 문제는 DLL 만 변경하면 많은 도움이되지 않는다는 것입니다. 내 폴더에 64 비트 DLL을 복사 할 때 여전히 작동하지 않지만 64 비트 라이브러리를 참조하는 응용 프로그램을 다시 컴파일해야합니다. 내가 뭔가 잘못하고 있는거야? 또한 어떤 버전을 참조해야하는지 이해할 수 없습니까? – axe

+1

예. 기본 라이브러리는 동일한 이름을 가져야하지만 다른 폴더 (예 : 앱의 하위 폴더)에 있어야합니다. 런타임시 OS는 SetDllDirectory를 호출하여 비트 수에 따라 올바른 폴더를 찾습니다. 또는'AppDomain.CurrentDomain.AssemblyResolve' 이벤트를 [Rover가 제안한 것] ​​(http://stackoverflow.com/questions/3787428/loading-x86-or-x64-assembly#comment7029800_6060754)과 같이 사용하십시오. 당신은 SQLite 관리 래퍼가 직접 이러한 라이브러리를 참조하지 않습니다. 코드에 따라 래퍼는 기본 원시 라이브러리의 올바른 버전을로드합니다. – GSerg

+0

나는 그것을 다시 한번 시도했다, 그것은 나를 위해 작동하지 않는다. 시작시 응용 프로그램이 충돌합니다. 문제는 프로젝트에서 x64 라이브러리를 참조하고 있지만 런타임에 x86 라이브러리를 선택했습니다. x86 라이브러리를 사용하여 응용 프로그램을 빌드하면 x86 창에서 완벽하게 작동합니다. 그렇지 않으면 그렇지 않습니다. – axe

답변

6

주요 문제는 x86 및 x64을위한 SQLite는 서로 다른 버전을 사용하고 있다는 사실이었다. 나는 방법

static private Assembly SQLitePlatformSpecificResolve(object sender, ResolveEventArgs args) 
{ 
    string platform = Environment.Is64BitProcess ? "x64" : "x86"; 
    string assemblyName = new AssemblyName(args.Name).Name; 
    string assemblyPath = Path.Combine(
     Environment.CurrentDirectory, "SQLite", platform, assemblyName + ".dll"); 

    return !File.Exists(assemblyPath) ? null : Assembly.LoadFrom(assemblyPath); 
} 

그리고 기본 응용 프로그램 진입 점에서 설정 이벤트 핸들러

AppDomain.CurrentDomain.AssemblyResolve += SQLitePlatformSpecificResolve; 

을 추가했다. 이제 x86 플랫폼에는 x86 어셈블리가, 64 비트 플랫폼에는 x64가로드됩니다.

감사합니다.