Não foi possível carregar o arquivo ou assembly 'System.Data.SQLite'

126

Instalei o ELMAH 1.1 .Net 3.5 x64 no meu projeto ASP.NET e agora estou recebendo esse erro (sempre que tento ver qualquer página):

Não foi possível carregar o arquivo ou assembly 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.

Descrição: ocorreu uma exceção não tratada durante a execução da solicitação da web atual. Revise o rastreamento de pilha para obter mais informações sobre o erro e onde ele se originou no código.

Detalhes da exceção: System.BadImageFormatException: Não foi possível carregar o arquivo ou o conjunto 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.

Mais detalhes do erro na parte inferior.

Minha plataforma Active Solution é "Qualquer CPU" e estou executando um Windows 7 x64 em um processador x64, é claro, um processador. A razão pela qual estamos usando esta versão do ELMAH é porque 1.0 .Net 3.5 (x86, que é a única plataforma para a qual é compilada) nos deu o mesmo erro no servidor Windows x64.

Eu tentei compilar para x86 e x64 e recebo o mesmo erro. Eu tentei remover toda a saída do compilador (bin e obj). Finalmente, eu fiz uma referência diretamente à dll SQLite, algo que não era necessário para o projeto funcionar no servidor e eu tenho esse erro do compilador:

Erro 1 Aviso como erro: Geração de assembly - assembly referenciado 'System.Data.SQLite.dll' tem como alvo um processador diferente MyProject

Alguma ideia sobre o que pode ser o problema?

Mais detalhes do erro:

Erro de origem:

Uma exceção não tratada foi gerada durante a execução da solicitação da web atual. Informações sobre a origem e o local da exceção podem ser identificadas usando o rastreamento da pilha de exceções abaixo.

Rastreio de pilha:

[BadImageFormatException: não foi possível carregar o arquivo ou assembly 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.]
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 forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntrospection) Carregar (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: não foi possível carregar o arquivo ou assembly 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.]
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): não foi possível carregar o arquivo ou assembly 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.]
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

[HttpException (0x80004005): não foi possível carregar o arquivo ou assembly 'System.Data.SQLite, Versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma de suas dependências. Foi feita uma tentativa de carregar um programa com um formato incorreto.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (contexto HttpContext) +85
System.Web.HttpRuntime.ProcessRequestInternal ( HttpContext) ) +259

pupeno
fonte
Um log do Fusion (ligação de montagem) é muito mais útil nesses casos do que esta folha de um rastreamento de pilha.
Anton Tykhyy
1
Parece que o problema era que a Cassini é x86.
pupeno
Eu tive o mesmo problema e tive que abandonar o ELMAH por causa do ambiente misto de produção / desenvolvimento que temos. Dado que o uso do SQLite em um servidor Web de produção de alto tráfego não parece muito bom e o fato de que o SQLite dll é o único assembly no ELMAH que o força a ter duas versões diferentes para bits x86 e 64x, estou me perguntando por que os caras do ELMAH puxam e torne-o opcional e não o que é agora.
Khash

Respostas:

122

System.Data.SQLite.dllé um assembly misto, ou seja, contém código gerenciado e código nativo. Portanto, um particular System.Data.SQLite.dllé x86 ou x64, mas nunca os dois.

Atualização ( cortesia de J. Pablo Fernandez ): A Cassini, servidor de desenvolvimento da Web usado pelo Visual Studio quando você pressiona F5 ou clica no botão verde «play», é apenas x86, o que significa que, mesmo que sua estação de trabalho seja x64, você será apenas capaz de usar a versão x86 do System.Data.SQLite.dll.

Uma alternativa é não usar o Cassini, mas o IIS7, que é corretamente x64.

Anton Tykhyy
fonte
3
Estou usando a versão x64 em um computador x64.
pupeno
Você tentou usar a versão x86?
Anton Tykhyy
2
Uma nova alternativa que ficam disponíveis logo atrás é usar o IIS Express que permite que você defina o tipo de pool de aplicativos que deseja usar
Raul Vejar
@Raul Vejar: explique como o recurso de seleção de pool de aplicativos do IIS Express resolve o problema de montagem de 32 bits / 64 bits. Obrigado
Tim
@ Tim, esse recurso permite selecionar o tipo de pool de aplicativos que você deseja usar, de 32 ou 64 bits, para controlar o aspecto que foi corrigido no Cassini e trabalhar com a mesma biblioteca de bits que você possui. Em outras palavras, se você estiver usando a versão de 32 bits da dll SQLite, deverá selecionar o pool de aplicativos de 32 bits no IIS Express. Para a versão de 64 bits da biblioteca, você deve selecionar o pool de aplicativos de 64 bits.
Raul Vejar
77

Verifique se "Ativar aplicativos de 32 bits" está definido como falso para o pool de aplicativos.

beckelmw
fonte
2
Isso funciona se você desejar usar a x86 dll na máquina de 64 bits. No nosso caso, nossos ambientes de desenvolvimento e produção não correspondem, então foi isso que funcionou melhor.
10242 Rob
17
Configurá-lo como verdadeiro para mim realmente resolveu o problema. Eu acho que o Elmah é enviado com o assembly sql lite de 32 bits por padrão.
1
+1 para @Jirapong e Sergey, porque foi nessa configuração que tive que manipular para fazer as coisas funcionarem. No meu caso, acho que tinha a versão x86 da DLL SqlLite e precisava que Ativar aplicativos de 32 bits fosse definido como "true".
t3rse
43

Vá para o IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

umar
fonte
Estou executando o Windows 7 e encontrei esse problema; ativar 32 bits corrigiu isso para mim, provavelmente porque minha cópia da DLL era 32 bits.
Doug
1
FYI: Era necessário definir a identidade do pool de aplicativos como LocalSystem para que isso funcionasse: ^
Illuminati
E certifique-se de ter uma versão Win32 do SQLite.Interop.dll stackoverflow.com/questions/4816529/…
Morten Holmgaard
14

Isso é muito simples se você não estiver usando o SQLite:

Você pode excluir as DLLs do SQLite das pastas bin da solução e depois da pasta em que você faz referência ao ELMAH. Reconstrua, e seu aplicativo não tentará carregar esta DLL que você não está usando.

Chris
fonte
5
+1 Se você não estiver usando o SQLite, por que se preocupar em corrigir a DLL referenciada? Bonito, elegante e exatamente o que eu precisava.
bhavinb
Isso funcionou localmente, mas recebi o erro após a implantação no Azure.
Stuartdotnet
8

Eu tenho uma máquina dev de 64 bits e um servidor de compilação de 32 bits. Eu usei esse código antes da inicialização do NHibernate. Funciona um charme em qualquer arquitetura (bem os 2 que eu testei)

Espero que isso ajude alguém.

Guido

        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";
        }
gatapia
fonte
Alguém usou com sucesso essa técnica? Eu tentei em uma solução de aplicativo de teste asp.net mvc e não funcionou para mim.
Glenn
1
Em vez de ir para a variável de ambiente, você pode usar o CLR diretamente: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse
2
Ou a propriedade Environment.Is64BitProcess (desde .NET4).
riezebosch 27/09/11
5

No nosso caso, não funcionou porque nosso servidor de produção está ausente

Pacote redistribuível do Microsoft Visual C ++ 2010 SP1 (x86)

Instalamos e tudo funciona bem. O pool de aplicativos deve ter Ativar aplicativos de 32 bits definido como true e você deve ter a versão x86 da biblioteca

Marcos Meli
fonte
1
Funciona para mim. Ele apenas fornece uma mensagem de erro sem indicar que a biblioteca C está ausente, o que é horrível.
Br
1
Para mim eu tenho instalado vcredist 2008 x64 para System.Data.SQLite, versão = 1.0.99.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139
themadmax
5

Como alguém que teve que lidar com alguns relatórios de erros no Roadkill Wiki com exatamente o mesmo problema, é isso que você precisa fazer:

  • Você está usando x64 ou x86? O Sqlite vem com DLLs para arquiteturas separadas - copie o caminho certo para sua pasta bin, existem duas DLLS para o provedor oficial:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Se você não puder se incomodar em procurar esses assemblies, ative o modo de 32 bits para o seu App Pool (uma solução para máquinas de desenvolvimento normalmente)
  • Se você estiver hospedando em um servidor, precisará do Microsoft C ++ Runtime redistribuível - ele não está instalado no Server 2008 R2 por padrão. versão x64 , versão x86

É realmente uma dor de cabeça quantos buracos você precisa percorrer ao redistribuir os binários SQLite .NET, minha solução para o Roadkill no final foi copiar os binários corretos para a pasta ~ / bin com base na arquitetura que você está usando . Infelizmente, isso não resolve o problema de tempo de execução do C ++.

Chris S
fonte
5

Eu resolvi isso instalando System.Data.SQLite com extensão Nuget. Esta extensão pode ser usada para o Visual Studio 2010 ou superior. Primeiro, você precisa instalar a extensão Nuget. Você pode acompanhar aqui:

  • Vá para o Visual Studio 2010, Menu -> Ferramentas
  • Selecione Gerenciador de extensão
  • Digite NuGet na caixa de pesquisa e clique em Galeria Online. Aguardando Recuperar informações…
  • Selecione o NuGet Package Manager recuperado, clique em Download. Esperando Download ...
  • Clique em Instalar no NuGet Package Manager do Visual Studio Extension Installer. Aguarde a instalação ser concluída.
  • Clique em Fechar e 'Reiniciar agora.

Segundo, agora você pode instalar o SQLite:

E agora, você pode usar System.Data.SQLite.

No caso, você vê duas pastas x64 e x86, essas pastas contêm SQLite.Interop.dll. Agora vá para as janelas de propriedades dessas DLLs e defina a ação de compilação como conteúdo e o diretório Copiar para saída é Copiar sempre.

Então, esse é o meu caminho.

Obrigado. Kim Tho Pham, Cidade de HoChiMinh, Vietnã. E-mail: [email protected]

Kim Thọ Phạm
fonte
4

O assembly System.Data.SQLite relacionado à carga manual pode resolver isso.

O código da gatapia foi alterado conforme abaixo:

    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";
    }
lxwwqw
fonte
4

Eu recebi esse erro quando nosso servidor Windows foi convertido do SO de 32 bits para 64 bits. A montagem que estava lançando o erro foi configurada para compilar no modo x86 (ou seja, modo 32). Eu mudei para "Qualquer CPU" e isso fez o truque. Você pode alterar esse valor fazendo o seguinte:

clique direito no projeto vá para Properties -> Build -> Platform Target -> change to "Any CPU"

goku_da_master
fonte
1
Eu estava tentando usar o System.Data.SQLite.dll de 32 bits e obtendo essa exceção ao executar na CPU de 64 bits. Mudei o destino da plataforma de "Qualquer CPU" para "x86" e isso fez a exceção desaparecer. A menos que você esteja procurando maximizar o desempenho, é melhor criar o denominador menos comum para que ele seja executado em uma CPU de 32 ou 64 bits.
Cdavidyoung
3

Resolvi isso, curiosamente, instalando o System.Data.SQLite por meio do aplicativo Nuget GUI, em oposição ao console do gerenciador de pacotes.

A instalação via console não incluiu as dependências que esta biblioteca precisa executar.

JMK
fonte
3

System.Data.SQLitedepende de System.Data.SQLite.interopgarantir que ambos os pacotes sejam da mesma versão e sejam ambos x86 .

Esta é uma pergunta antiga, mas tentei todas as opções acima. Eu estava trabalhando em um projeto estritamente x86 , então não havia duas pastas / x86, / x64. Mas, por alguma razão, a System.Data.SQLiteversão era diferente System.Data.SQLite.interop, uma vez que eu puxei as DLLs correspondentes, o problema foi corrigido.

Fluxo do empilhador
fonte
1

Eu vim com 2 soluções rápidas. Ou funciona para mim. Eu acho que o problema é por causa das permissões.

1) Em vez de usar o arquivo Elmah.dll do diretório net-2.0, usei o Elmah.dll do net-1.1.

2) Em vez de manter o Elmah.dll no diretório bin do projeto. Eu faço um diretório DLL para colocá-lo.

Anon
fonte
1

Outra maneira de contornar isso é apenas atualizar seu aplicativo para o ELMAH 1.2, em vez de 1.1.

Peter Bernier
fonte
0

Você pode excluir sua pasta bin debug e recompilar novamente?

Ou verifique a referência do seu projeto para System.Data.SQLite, localize onde está localizado e abra a dll no refletor. Se você não conseguir abri-lo, isso significa que a dll está corrompida, convém encontrar uma correta ou reinstalar a estrutura .net.

Graviton
fonte
Eu tentei adicionar a referência ao System.Data.SQLite diretamente (além de remover bin e obj) e obtive este erro: Erro 1 Aviso como erro: Geração de assembly - assembly referenciado 'System.Data.SQLite.dll 'como alvo um MyProject processador diferente
pupeno
0

Se você estiver usando o IIS Express como servidor da Web em sua máquina de desenvolvimento, eu mudaria para Local IIS. Isso funcionou para mim.

cyclo_magic
fonte
0

Esta é uma postagem antiga, mas pode ajudar algumas pessoas que pesquisam esse erro a tentar definir "Ativar aplicativos de 32 bits" como True para o pool de aplicativos. Foi isso que resolveu o erro para mim. Encontrei esta solução lendo alguns comentários da resposta de @ beckelmw.

MichaelD
fonte
0

Você provavelmente tem o pacote errado instalado. Você deseja o pacote produzido pela Microsoft que implementa o modelo de provedor System.Data.Common.

pimbrouwers
fonte