2012-10-25 1 views
1

이 문제에 대한 조사를 해본 결과 몇 가지 가능한 해결책이 있지만 나에게 도움이되지는 못했습니다.SQLite DLL을 WPF 응용 프로그램에서로드하지 못했습니다.

파일 또는 어셈블리 'System.Data.SQLite.dll'또는 해당 종속성 중 하나를로드 할 수 없습니다. 지정한 모듈을 찾을 수 없습니다.

SQLite를 사용하는 WPF 응용 프로그램이 있습니다. 내 개발 컴퓨터 (Windows 7, 64 비트, Visual Studio 2010)에서는 모든 것이 잘 작동합니다. QA 부서에서 모든 것이 정상적으로 작동합니다. 그러나 고객 서비스 (32 비트)의 빌드 머신 (Windows Server 2008, 64 비트) 이상에서는 오류가 발생합니다.

내 .sln은 두 개의 .exe 프로젝트와 두 개의 .exe 프로젝트 (SQLite 로직 포함)로 구성된 3 개의 프로젝트로 구성됩니다. 모두 3 개가 Debug 및 Release의 두 가지 구성을 가지고 있으며 각 버전은 x86으로 컴파일됩니다. SQLite dll이 실행 디렉토리에 있습니다.

내 GAC에 3 개의 System.Data.SQLite 항목이 있습니다.이 항목은 내 컴퓨터에서 성공했지만 다른 특정 항목이 아닌 이유로 확인 되었기 때문에 발견 된 DLL을 사용하지 않는 이유는 알 수 없습니다 실행중인 디렉토리에서. 모든 GAC 항목은 버전 1.0.66.0이고 공개 키 토큰은 같으며 MSIL, x86 및 AMD64와 각각 연관됩니다. GAC에서 파일을 제거하면 프로젝트 참조가 "로컬 복사"로 변경 될 때까지 오류를 재현 할 수있었습니다.이 시점에서 내 컴퓨터에서 다시 작동했습니다 (여전히 다른 컴퓨터에서는 작동하지 않음).

이것이 얼마나 똑똑한 지 잘 모르겠지만 (프로젝트에서 참조를 사용하면서) dll의 동적로드를 시도하고 32 비트 또는 64 비트 환경에서 실행 중인지 확인하고 Assembly.LoadFrom 올바른 비트에 대한 SQLite DLL을로드합니다. 이 코드는 성공적으로 실행되고 내 64 비트 컴퓨터에서 32 비트 버전으로 이동합니다. 이는 x86 컴파일 플랫폼 때문이라고 생각합니다. 그럼에도 불구하고 다른 컴퓨터에서 볼 수있는 오류는 변경되지 않았습니다.

이 문제를 해결하는 방법에 대한 제안 사항은 무엇입니까?

편집 : 나는 과거에 같은 문제를했다 GAC

+2

누락 된 것을 찾기 위해 [DependencyWalker] (http://www.dependencywalker.com/)와 같은 것을 사용해 보셨습니까? – climbage

+0

그래 의존성 워커와 퓨전 뷰어는 이것을 디버깅하는 것이 좋습니다. – AbdElRaheim

+0

필자는 Dependency Walker를 가끔 사용했지만 필자가 자신의 기술에 익숙하다고 말하기에는 충분하지 않습니다. Dependency Walker에서 내 .exe (그리고 그 이후, SQLite로 대부분의 작업을 수행하는 dll - 같은 결과)를로드하고 그 아래에 나타나는 유일한 것은 MSCOREE.DLL입니다. 확실하게 나는 여기서 무엇을보아야하는지 오해하지만, 내 파일이 의존하는 .dll을 보지 말아야합니까? SQLite dll을 참조하지 않고도 컴파일 할 수 없습니다. – REW

답변

1

에서 참조를 제거한 후 결과를 반영합니다. 저는 버전으로 빌드합니다 : 하나는 System.Data.SQLite x32를 참조하고 다른 하나는 x64를 참조합니다.

+0

나는 그 일로 오지 않기를 바라고 있습니다. 그러나 나는 현재 어떤 좋은 대안도보고 있지 않습니다. – REW

+0

좋아요, 나는 인정하고 있는데, 여기가 내가있는 곳입니다 - 이중 빌드. 나는 이전에 이처럼 이중 빌드를 실제로 수행하지 않았습니다. 나는 실수로 생각하기 쉽다 :) 어쨌든 64 비트로 빌드하면 64 비트 SQLite 참조를 추가해야하며 32 비트와 완전히 다른 이름으로 존재한다. 32 비트로 전환 할 때 SQLiteConnection이 두 참조 (duh)에 존재한다는 것을 알리는 모든 종류의 오류가 발생합니다. 2 .csproj 파일이 필요하지 않습니다. – REW

+0

레코드의 경우 SQLite dll의 올바른 버전을 올바른 위치에 가져 오기 위해 빌드 이벤트를 사용하여 창의적이었습니다. – REW

관련 문제