[.net] 파일 또는 어셈블리 ‘System.Data.SQLite’를로드 할 수 없습니다

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



답변

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을 사용하는 것입니다.


답변

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


답변

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


답변

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

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


답변

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";
        }


답변

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

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

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


답변

정확히 동일한 문제로 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 ++ 런타임 문제는 해결되지 않습니다.