파일 또는 어셈블리 'System.Data.SQLite'를로드 할 수 없습니다


126

ASP.NET 프로젝트에 ELMAH 1.1 .Net 3.5 x64를 설치했는데이 오류가 발생합니다 (페이지를 보려고 할 때마다).

파일 또는 어셈블리 'System.Data.SQLite, 버전 = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.

설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 발생한 위치에 대한 자세한 정보는 스택 추적을 검토하십시오.

예외 정보 : System.BadImageFormatException : 파일 또는 어셈블리 'System.Data.SQLite, 버전 = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.

하단에 더 많은 오류 정보가 있습니다.

내 Active Solution 플랫폼은 "Any CPU"이며 x64의 x64 Windows 7, 물론 프로세서에서 실행 중입니다. 이 버전의 ELMAH를 사용하는 이유는 x64 Windows 서버에서 1.0 .Net 3.5 (x86, 컴파일 된 유일한 플랫폼)가 동일한 오류를 발생했기 때문입니다.

x86 및 x64에 대해 컴파일을 시도했지만 동일한 오류가 발생합니다. 모든 컴파일러 출력 (bin 및 obj)을 제거하려고했습니다. 마지막으로 서버에서 프로젝트를 수행하는 데 필요하지 않은 SQLite dll을 직접 참조 했으며이 컴파일러 오류가 발생했습니다.

오류 1 오류로 경고 : 어셈블리 생성-참조 된 어셈블리 'System.Data.SQLite.dll'이 다른 프로세서 MyProject를 대상으로 함

문제가 무엇인지 아이디어가 있습니까?

더 자세한 오류 정보 :

소스 오류 :

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래 예외 스택 추적을 사용하여 식별 할 수 있습니다.

스택 추적 :

[BadImageFormatException : 파일 또는 어셈블리 'System.Data.SQLite, 버전 = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forInspectspection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, 증거 어셈블리 보안, StackCrawlMark & ​​stackMark, Introspection에 대한 부울) +142 System.Reflection.Assembly. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (문자열 assemblyName, 부울 starDirective) +46

[ConfigurationErrorsException : 파일 또는 어셈블리 'System.Data.SQLite, 버전 = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.Web.Configuration .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +337

[HttpException (0x80004005) : 파일 또는 어셈블리 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize ( ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters 호스팅 매개 변수) +729

[HttpException (0x80004005) : 파일 또는 어셈블리 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139'또는 해당 종속성 중 하나를로드 할 수 없습니다. 형식이 잘못된 프로그램을로드하려고했습니다.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext context) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext context) +85
System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr ) +259


이러한 경우 스택 추적 시트보다 Fusion (어셈블리 바인딩) 로그가 훨씬 더 유용합니다.
Anton Tykhyy

1
문제는 Cassini가 x86이라는 것입니다.
pupeno

나는 같은 문제를 겪었고 우리가 가진 생산 / 개발 환경이 혼합되어 있기 때문에 ELMAH를 포기해야했습니다. 트래픽이 많은 프로덕션 웹 서버에서 SQLite를 사용하는 것이 그리 좋지 않고 SQLite dll이 ELMAH에서 x86 및 64x 비트에 대해 두 가지 버전을 갖도록 강요하는 ELMAH의 유일한 어셈블리라는 사실을 감안할 때 ELMAH 사람들이 왜 풀어야하는지 궁금합니다. 현재 상태가 아니라 선택 사항으로 만듭니다.
Khash

답변:


122

System.Data.SQLite.dll혼합 어셈블리입니다. 즉 관리 코드와 기본 코드가 모두 포함됩니다. 따라서 특정 System.Data.SQLite.dll은 x86 또는 x64이지만 둘다는 아닙니다.

업데이트 ( 제공 : J. Pablo Fernandez ) : F5를 누르거나 녹색«재생»버튼을 클릭 할 때 Visual Studio에서 사용하는 개발 웹 서버 인 Cassini는 x86 전용이므로 워크 스테이션이 x64 인 경우에도 x86 버전의 System.Data.SQLite.dll을 사용할 수 있습니다.

또 다른 대안은 Cassini를 사용하지 않고 제대로 x64 인 IIS7을 사용하는 것입니다.


3
x64 컴퓨터에서 x64 버전을 사용하고 있습니다.
pupeno

x86 버전을 사용해 보셨습니까?
Anton Tykhyy

2
바로 전에 사용할 수있는 새로운 대안은 IIS Express를 사용하여 사용하려는 응용 프로그램 풀 유형을 설정할 수 있다는 것입니다.
Raul Vejar

@Raul Vejar : IIS Express의 응용 프로그램 풀 선택 기능이 32 비트 / 64 비트 어셈블리 문제를 어떻게 해결하는지 자세히 설명하십시오. 감사합니다
Tim

@Tim,이 기능을 사용하면 사용하려는 응용 프로그램 풀 유형을 32 비트 또는 64 비트 중에서 선택할 수 있습니다. 이렇게하면 Cassini에서 수정 된 화면비를 제어하고 가지고있는 것과 동일한 비트 라이브러리로 작업 할 수 있습니다. 즉, 32 비트 버전의 SQLite dll을 사용하는 경우 IIS Express에서 32 비트 응용 프로그램 풀을 선택해야합니다. 64 비트 버전의 라이브러리의 경우 64 비트 응용 프로그램 풀을 선택해야합니다.
Raul Vejar

77

앱 풀에 대해 "32-비트 응용 프로그램 사용"이 false로 설정되어 있는지 확인하십시오.


2
64 비트 시스템에서 x86 dll을 사용하려는 경우 작동합니다. 우리의 경우 개발 환경과 프로덕션 환경이 일치하지 않으므로 이것이 가장 효과적이었습니다.
Rob

17
나를 위해 true로 설정하면 실제로 문제가 해결되었습니다. Elmah는 기본적으로 32 비트 SQL Lite 어셈블리와 함께 제공됩니다.

1
@Jirapong과 Sergey 모두 +1이 설정이기 때문에 일을 처리하기 위해 조작해야했습니다. 제 경우에는 SqlLite DLL의 x86 버전이 있고 Enable 32-Bit Applications를 "true"로 설정해야한다고 생각합니다.
t3rse

43

로 이동하십시오 IIS7 Application Pool -> advanced settings and set the 32-bit application to true.


Windows 7을 실행 중이며이 문제가 발생했습니다. 32 비트를 켜면 DLL 사본이 32 비트 였기 때문에 아마도 고정되어 있습니다.
Doug

1
참고 :이 작업을 수행하려면 응용 프로그램 풀 ID를 LocalSystem으로 설정해야합니다. ^
Illuminati

그리고 지 확인하세요 SQLite.Interop.dll의의는 Win32 버전을 가지고 stackoverflow.com/questions/4816529/...
모르 텐 Holmgaard

14

SQLite를 사용하지 않는 경우 매우 간단합니다.

솔루션의 bin 폴더에서 ELite를 참조하는 폴더에서 SQLite DLL을 삭제할 수 있습니다. 다시 빌드하면 앱에서 사용하지 않는이 DLL을로드하지 않습니다.


5
+1 SQLite를 사용하지 않는다면 왜 참조 된 DLL을 고치는가? 멋지고 우아하고 내가 필요한 것.
bhavinb

이것은 로컬에서 작동했지만 Azure에 배포 한 후 오류가 발생했습니다.
stuartdotnet

8

64 비트 dev 시스템과 32 비트 빌드 서버가 있습니다. NHibernate 초기화 전에이 코드를 사용했습니다. 모든 아키텍처에서 매력을 발휘합니다 (잘 테스트 한 2 개)

이것이 누군가를 돕기를 바랍니다.

귀도

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }

이 기술을 성공적으로 사용한 사람이 있습니까? 테스트 asp.net mvc 앱 솔루션에서 시도했지만 작동하지 않았습니다.
글렌

1
환경 변수로 이동하는 대신 CLR을 직접 사용할 수 있습니다. string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse

2
또는 .NET4부터 Environment.Is64BitProcess 속성입니다.
riezebosch

5

우리의 경우 프로덕션 서버가 없기 때문에 작동하지 않았습니다.

Microsoft Visual C ++ 2010 SP1 재배포 가능 패키지 (x86)

우리는 그것을 설치했고 모두 잘 작동합니다. 응용 프로그램 풀에는 32 비트 응용 프로그램 사용이 true로 설정되어 있어야하며 x86 버전의 라이브러리가 있어야합니다.


1
나를 위해 작동합니다. C 라이브러리가 누락되었음을 지적하지 않고 오류 메시지를 표시합니다.
brk

1
나를 위해 내가 System.Data.SQLite, 버전 = 1.0.99.0, 문화 = 중립, PublicKeyToken = db937bc2d44ff139에 대한 vcredist 2008의 x64을 설치 한
themadmax

5

정확히 동일한 문제로 Roadkill Wiki에 대한 버그 보고서를 처리 해야하는 사람은 다음과 같이해야합니다.

  • x64 또는 x86을 사용하고 있습니까? Sqlite에는 별도의 아키텍처를위한 DLL이 포함되어 있습니다. 올바른 것을 bin 폴더에 복사하면 공식 제공 업체를위한 두 개의 DLL이 있습니다.System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 이러한 어셈블리를 검색하는 데 어려움을 겪지 않으면 앱 풀에 32 비트 모드를 사용하도록 설정하십시오 (일반적으로 개발자 컴퓨터 전용 솔루션).
  • 서버에서 호스팅하는 경우 Microsoft C ++ 런타임 재배포 가능 파일이 필요합니다. 기본적으로 Server 2008 R2에 설치되어 있지 않습니다. x64 버전 , x86 버전

SQLite .NET 바이너리를 다시 배포 할 때 얼마나 많은 농구대를 뛰어 넘을 수 있는지는 정말 고통 스럽습니다. 결국 Roadkill의 솔루션은 사용하는 아키텍처에 따라 올바른 바이너리를 ~ / bin 폴더에 복사하는 것이 었습니다. . 불행히도 C ++ 런타임 문제는 해결되지 않습니다.


5

Nuget 확장명으로 System.Data.SQLite를 설치 하여이 문제를 해결했습니다. 이 확장은 Visual Studio 2010 이상에 사용할 수 있습니다. 먼저 Nuget 확장을 설치해야합니다. 당신은 여기를 따라갈 수 있습니다 :

  • Visual Studio 2010, 메뉴-> 도구로 이동하십시오.
  • 확장 관리자 선택
  • 검색 창에 NuGet을 입력하고 온라인 갤러리를 클릭하십시오. 대기 중 정보 검색 중…
  • 검색된 NuGet 패키지 관리자를 선택하고 다운로드를 클릭하십시오. 다운로드 중…
  • Visual Studio Extension Installer NuGet 패키지 관리자에서 설치를 클릭하십시오. 설치가 완료 될 때까지 기다리십시오.
  • 닫기와 '지금 다시 시작'을 클릭하십시오.

둘째, 이제 SQLite를 설치할 수 있습니다 :

이제 System.Data.SQLite를 사용할 수 있습니다.

이 경우 두 개의 폴더 x64와 x86이 표시되며이 폴더에는 SQLite.Interop.dll이 포함됩니다. 이제 해당 dll의 속성 창으로 이동하여 빌드 조치가 컨텐츠이고 출력 디렉토리에 복사가 항상 복사임을 설정하십시오.

그래서 그것은 나의 길이다.

감사. 베트남 호치민시 김 토팜 이메일 : tho.phamkim@gmail.com


4

수동로드 관련 System.Data.SQLite 어셈블리가이를 해결할 수 있습니다.

가타 피아의 코드가 아래와 같이 변경되었습니다 :

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }

4

Windows 서버가 32 비트 OS에서 64 비트로 변환되었을 때이 오류가 발생했습니다. 오류가 발생한 어셈블리는 x86 모드 (예 : 32 모드)에서 컴파일되도록 설정되었습니다. 나는 그것을 "Any CPU"로 바꾸었고 그 트릭을했다. 다음을 수행하여이 값을 변경할 수 있습니다.

프로젝트를 마우스 오른쪽 버튼으로 클릭하여 Properties -> Build -> Platform Target -> change to "Any CPU"


1
32 비트 System.Data.SQLite.dll을 사용하려고했지만 64 비트 CPU에서 실행될 때이 예외가 발생했습니다. 플랫폼 대상을 "Any CPU"에서 "x86"으로 변경했는데 예외가 사라졌습니다. 성능을 극대화하지 않으려는 경우 최소 공통 분모를 빌드하는 것이 32 또는 64 비트 CPU에서 실행하는 것이 좋습니다.
cdavidyoung

3

패키지 관리자 콘솔이 아닌 Nuget GUI 응용 프로그램을 통해 System.Data.SQLite를 설치하여 이상하게 도이 문제를 해결했습니다.

콘솔을 통한 설치에는이 라이브러리를 실행하는 데 필요한 종속성이 포함되어 있지 않습니다.


3

System.Data.SQLiteSystem.Data.SQLite.interop두 패키지가 모두 같은 버전이고 x86 인지 확인 하는 데 의존합니다 .

이것은 오래된 질문이지만 위의 모든 것을 시도했습니다. 나는 엄격히 x86 프로젝트를 작업하고 있었으므로 / x86, / x64 폴더는 두 개가 없었습니다. 그러나 어떤 이유로 든 일치하는 dll을 풀 다운하면 문제가 해결 된와 System.Data.SQLite다른 버전 System.Data.SQLite.interop이었습니다.


1

나는 2 가지 빠른 해결책을 생각해 냈습니다. 나를 위해 일하십시오. 문제는 권한 때문이라고 생각합니다.

1) net-2.0 디렉토리에서 Elmah.dll 파일을 사용하는 대신 net-1.1에서 Elmah.dll을 사용했습니다.

2) 프로젝트 빈 디렉토리에 Elmah.dll을 유지하는 대신. 그것을 넣을 dll 디렉토리를 만듭니다.


1

이 문제를 해결하는 또 다른 방법은 응용 프로그램을 1.1이 아닌 ELMAH 1.2로 업그레이드하는 것입니다.


0

bin 디버그 폴더를 삭제하고 다시 컴파일 할 수 있습니까?

또는 프로젝트 참조를 확인 System.Data.SQLite하고 위치를 추적 한 다음 리플렉터에서 dll을 엽니 다. 열 수 없으면 dll이 손상되었음을 의미합니다. 올바른 것을 찾거나 .net 프레임 워크를 다시 설치해야 할 수 있습니다.


bin과 obj를 제외하고 System.Data.SQLite에 대한 참조를 직접 추가하려고 시도했지만 다음 오류가 발생했습니다. 오류 1 오류로 경고 : 어셈블리 생성-참조 된 어셈블리 'System.Data.SQLite.dll '는 다른 프로세서 MyProject를 목표로합니다
pupeno

0

개발 컴퓨터에서 IIS Express를 웹 서버로 사용하는 경우 로컬 IIS로 변경합니다. 이것은 나를 위해 일했습니다.


0

이 게시물은 오래된 게시물이지만 일부 사용자는이 오류를 검색하여 앱 풀에 대해 "32 비트 응용 프로그램 사용"을 True로 설정하는 데 도움이 될 수 있습니다. 그것이 나를 위해 오류를 해결 한 것입니다. @beckelmw의 답변에 대한 의견을 읽음 으로써이 해결책을 찾았습니다.


0

잘못된 패키지가 설치되었을 수 있습니다. System.Data.Common 공급자 모델을 구현하는 Microsoft에서 제작 한 패키지를 원합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.