문제

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

파일 또는 어셈블리 'System.data.sqlite, 버전 = 1.0.61.0, Culture = Neutral, PublicKeyToken = DB937BC2D44FF139'또는 해당 종속성 중 하나를로드 할 수 없습니다.잘못된 형식의 프로그램을로드하려고 시도했습니다.

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

예외 세부정보:System.BadImageFormat예외:파일 또는 어셈블리 'System.data.sqlite, 버전 = 1.0.61.0, Culture = Neutral, PublicKeyToken = DB937BC2D44FF139'또는 해당 종속성 중 하나를로드 할 수 없습니다.잘못된 형식의 프로그램을로드하려고 시도했습니다.

자세한 오류 내용은 하단에 있습니다.

내 활성 솔루션 플랫폼은 "모든 CPU"이고 x64 프로세서, 물론 x64 Windows 7에서 실행되고 있습니다.이 버전의 ELMAH를 사용하는 이유는 1.0 .Net 3.5(컴파일된 유일한 플랫폼인 x86)가 x64 Windows 서버에서 이와 동일한 오류를 발생시켰기 때문입니다.

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

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

문제가 무엇인지 아시나요?

오류 세부정보:

소스 오류:

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

스택 추적:

[잘못된 이미지 형식예외:파일 또는 어셈블리 'System.data.sqlite, 버전 = 1.0.61.0, Culture = Neutral, PublicKeyToken = DB937BC2D44FF139'또는 해당 종속성 중 하나를로드 할 수 없습니다.잘못된 형식의 프로그램을로드하려고 시도했습니다.
System.Reflection.Assembly._nload (어셈블리 파일 이름, 문자열 코드베이스, 증거 어셈블리 보안, 어셈블리 위치 신자, 스택 마크 및 스택 마크, 부울 ThrowonFilenotFound, 부울 forintrospection) +0
System.Reflection.assembly.nload (어셈블리 파일 이름, 문자열 코드베이스, 증거 어셈블리 보안, 어셈블리 위치 신자, StackCrawlmark & ​​Stackmark, 부울 ThrowonFilenotfound, 부울 forintrospection) +43
system.reflection.assembly.internalload (어셈블리 어셈블리, 증거 어셈블리 보안, 스택 크롤링 마크 및 스택 마크, 부울 forintrospection) +127 system.reflection.assembly.internalload (String AssemblyString, 증거 어셈블리, 스택 크롤링 마크, 부울 forintrespection) +142 System. 로드 (String AssemblyString) +28
System.web.configuration.compilationsection.loadAsSemblyHelper (String AssemblyName, Boolean Stardiprection) +46

[구성 오류예외:파일 또는 어셈블리 'System.data.sqlite, 버전 = 1.0.61.0, Culture = Neutral, PublicKeyToken = DB937BC2D44FF139'또는 해당 종속성 중 하나를로드 할 수 없습니다.잘못된 형식의 프로그램을로드하려고 시도했습니다.
system.web.configuration.compilationsection.loadAsSemblyHelper (문자열 어셈블리 이름, 부울 stardirection) +613 System.web.configuration.compilationsection.loadallassembliesfromApmainbindirectory () +203 System.web.configuration.compileSection.LoadSembly () +1055
System.web.compilation.buildmanager.getReferencedAsSemblies (CompilationSection CompConfig) +178
System.Web.comPilation.BuildProvidersCompiler..CTOR (VirtualPath ConfigPath, 부울 지원 및 문자열 outputAsSemBlyMame) +54
System.Web.comPilation.applicationBuildProvider.getGlobalasaxBuildresult (Boolean isprecompiledApp) +232
System.web.compilation.buildmanager.compileglobalasax () +52 System.web.compilation.buildmanager.ensuretoplevelfilescompiled () +337

[Http예외(0x80004005):파일 또는 어셈블리 'System.data.sqlite, 버전 = 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 hostingParameters) +729

[Http예외(0x80004005):파일 또는 어셈블리 'System.data.sqlite, 버전 = 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.파블로 페르난데스): F5 키를 누르거나 녹색 «재생» 버튼을 클릭할 때 Visual Studio에서 사용하는 개발 웹 서버인 Cassini는 x86 전용입니다. 즉, 워크스테이션이 x64인 경우에도 x86 버전의 시스템만 사용할 수 있습니다. Data.SQLite.dll.

대안은 Cassini가 아닌 x64인 IIS7을 사용하는 것입니다.

다른 팁

앱 풀에 대해 "32비트 애플리케이션 활성화"가 false로 설정되어 있는지 확인하세요.

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

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

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

저는 64비트 개발 머신과 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";
        }

정확히 동일한 문제가 있는 Roadkill Wiki에서 꽤 많은 버그 보고서를 처리해야 했던 사람으로서 다음을 수행해야 합니다.

  • x64 또는 x86을 사용하고 있습니까?Sqlite는 별도의 아키텍처를 위한 DLL과 함께 제공됩니다. 올바른 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++ 런타임 문제는 해결되지 않습니다.

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

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

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

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

이 경우 두 개의 폴더 x64와 x86이 표시되며 이러한 폴더에는 SQLite.Interop.dll이 포함되어 있습니다.이제 해당 dll의 속성 창으로 이동하여 빌드 작업을 콘텐츠로 설정하고 출력 디렉터리에 복사를 항상 복사로 설정합니다.

그래서 그게 내 방식이에요.

감사해요.킴 톰, 베트남 호치민시.이메일:tho.phamkim@gmail.com

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

Gatapia의 코드를 아래와 같이 변경했습니다.

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

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

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

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

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

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

이상하게도 패키지 관리자 콘솔이 아닌 Nuget GUI 애플리케이션을 통해 System.Data.SQLite를 설치하여 이 문제를 해결했습니다.

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

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

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

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

이 문제를 해결하는 또 다른 방법은 애플리케이션을 1.1이 아닌 ELMAH 1.2로 업그레이드하는 것입니다.

System.Data.SQLite 의존성을 가지고 있다 System.Data.SQLite.interop 두 패키지가 모두 동일한 버전이고 둘 다인지 확인하십시오. x86.

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

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

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

개발 컴퓨터에서 IIS Express를 웹 서버로 사용하고 있다면 로컬 IIS로 변경하겠습니다.이것은 나에게 효과적이었습니다.

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

잘못된 패키지가 설치되었을 가능성이 높습니다.당신은 패키지를 원합니다 마이크로소프트 System.Data.Common 공급자 모델을 구현합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top