Pergunta

Eu instalei ELMAH 1,1 Net 3.5 x64 no meu projeto ASP.NET e agora estou recebendo este erro (sempre que eu tento ver qualquer página):

Não foi possível carregar arquivo ou assembly 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para carregar um programa com um formato incorreto.

Descrição: An excepção não tratada ocorreu durante a execução da web atual solicitação. Examine o rastreamento de pilha Para mais informações sobre o erro e onde foi originado no código.

Detalhes da exceção: System.BadImageFormatException: Poderia Não arquivo de carga ou montagem 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para carregar um programa com um formato incorreto.

Mais detalhes do erro na parte inferior.

Meu plataforma Active Solution é "Qualquer CPU" e eu estou correndo em um x64 do Windows 7 em um x64, é claro, processador. A razão pela qual estamos a utilizar esta versão do ELMAH é porque 1.0 Net 3.5 (x86, que é a única plataforma para a qual ele é compilado) nos deu esse mesmo erro em nosso servidor x64 do Windows.

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

Erro 1 Aviso como Erro: geração de Assembly - Referenciado montagem alvos 'System.Data.SQLite.dll' um processador diferente MyProject

Todas as idéias que o problema pode ser?

Mais detalhes do erro:

Fonte de erro:

Uma exceção não tratada foi gerada

durante a execução da atual solicitação da web. Informações sobre a origem e ao local da exceção podem ser identificadas utilizando a excepção Rastreamento de pilha abaixo.

Stack Trace:

[BadImageFormatException: Não foi possível Arquivo de carga ou montagem 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para 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, booleano forIntrospection) 127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, booleano forIntrospection) 142 System.Reflection.Assembly.Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, booleano starDirective) +46

[ConfigurationErrorsException: Poderia Não arquivo de carga ou montagem 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para carregar um programa com um formato incorreto.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, booleano 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 Arquivo de carga ou montagem 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para 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 Arquivo de carga ou montagem 'System.Data.SQLite, versão = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' ou uma das suas dependências. Uma tentativa foi feito para carregar um programa com um formato incorreto.]
System.Web.HttpRuntime.FirstRequestInit (HttpContext contexto) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext contexto) +85
System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest wr) 259

Foi útil?

Solução

System.Data.SQLite.dll é um conjunto misto, ou seja, ele contém tanto código gerenciado e código nativo. Portanto, um System.Data.SQLite.dll particular é x86 ou x64, mas nunca ambos.

Update ( cortesia J. Pablo Fernandez ): Cassini, o servidor de desenvolvimento web utilizado pelo Visual Studio quando você pressionar F5 ou clique no «jogo» botão verde, é x86 única que significa que mesmo se sua estação de trabalho é x64, você só vai ser capaz de usar a versão x86 do System.Data.SQLite.dll.

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

Outras dicas

Certifique-se de que "Ativar 32 - bit aplicativos." É definida como false para o pool de aplicativo

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

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

Você pode excluir as DLLs SQLite a partir de pastas de lixo da sua solução, em seguida, a partir da pasta onde você faz referência ELMAH. Reconstruir, e seu aplicativo não tentará carregar essa DLL que você não está usando.

Eu tenho uma máquina dev 64 bits e servidor de compilação de 32 bits. Eu usei esse código antes NHibernate inicialização. Funciona um charme em qualquer arquitetura (bem a 2 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";
        }

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

  • Você está usando x64 ou x86? Sqlite vem com DLLs para arquiteturas distintas - copiar o caminho certo para a pasta bin, há duas DLLs para o provedor oficial: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Se você não pode ser incomodado caça ao redor para estes conjuntos, ativar o modo de 32 bits para o seu App Pool (uma solução para máquinas dev única geralmente)
  • Se você está hospedando em um servidor, você vai precisar do redistribuível Microsoft C ++ Runtime - não é instalado no Server 2008 R2 por padrão. x64 versão , versão x86

É uma verdadeira dor no traseiro quantos aros você tem que saltar através de quando re-distribuir o SQLite .NET binários, a minha solução para Roadkill no final foi para copiar os binários corretos para a pasta ~ / bin baseado no arquitetura sua utilização. Infelizmente isso não resolve o problema ++ runtime C.

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

  • Vá para Visual Studio 2010, Menu -> Ferramentas
  • Selecionar Extension Manager
  • Digite NuGet na caixa de busca e clique em Galeria Online. Esperando que Recuperar informações ...
  • Selecione o recuperado NuGet Package Manager, clique em Download. Espera que Download ...
  • Clique em Instalar no Visual Studio extensão Installer NuGet Package Manager. Espere até que a instalação seja concluída.
  • Clique em Fechar e 'Reiniciar agora.

Em segundo lugar, agora, você pode instalar SQLite:

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

No caso, você vê dois x64 pasta e, x86, essas pastas contêm SQLite.Interop.dll. Agora vá para Propriedades das janelas dessas DLLs e conjunto de ações de construção é o conteúdo e Copiar para o diretório de saída é copiar sempre.

Então, essa é a minha maneira.

Graças. Kim Tho Pham, Cidade de Ho Chi Minh, Vietnã. Email: tho.phamkim@gmail.com

Carga manual relacionada System.Data.SQLite montagem pode resolver esse problema.

Código de gatapia 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";
    }

Eu tenho esse erro quando o nosso servidor windows foi convertido de 32 bits do sistema operacional para 64 bits. O conjunto que foi jogando o erro foi definido para compilar no modo x 86 (ou seja, 32 de modo). Troquei-o para "Qualquer CPU" e que fez o truque. Você pode alterar esse valor, fazendo o seguinte:

clique direito sobre o projeto ir para Properties -> Build -> Platform Target -> change to "Any CPU"

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

Microsoft Visual C ++ 2010 SP1 Redistributable Package (x86)

Nós instalou-lo e todos funcionam bem. O pool de aplicativos deve ter ativar aplicativos de 32 bits definida como true e você deve a versão x86 da biblioteca

Eu resolvi isso, curiosamente, através da instalação de System.Data.SQLite através da aplicação Nuget GUI, em oposição ao console gerenciador de pacotes.

A instalação através do console não incluem as dependências desta biblioteca precisa para ser executado.

Eu vim com 2 soluções rápidas. De qualquer trabalho para mim. Eu acho que o problema é devido a permissões.

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

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

Outra maneira de contornar este problema é apenas para atualizar seu aplicativo para ELMAH 1.2 em vez de 1.1.

System.Data.SQLite tem uma dependência em System.Data.SQLite.interop Certifique-se de ambos os pacotes são a mesma versão e são ambos 86 .

Esta é uma questão de idade, mas eu tentei todos os acima. Eu estava trabalhando em um estritamente 86 projeto, então não havia duas pastas / x86, / x64. Mas por alguma razão, o System.Data.SQLite era uma versão diferente para System.Data.SQLite.interop, uma vez que eu puxado para baixo correspondência dlls o problema foi corrigido.

Você pode excluir sua pasta bin de depuração e recompilar novamente?

Ou verifique a sua referência de projeto para o System.Data.SQLite, rastrear onde ele está localizado, em seguida, abra a dll no refletor. Se você não pode abri-lo, o que significa que a DLL é corrompido, você pode querer encontrar um correcto ou reinstalar o .NET framework.

Se você estiver usando o IIS Express como o servidor web em sua máquina de desenvolvimento gostaria de mudar para Local IIS. Isso funcionou para mim.

Este é um post antigo, mas pode ajudar algumas pessoas procurando sobre esse erro para tentar definir "permitir que os aplicativos de 32 bits" como True para o pool de aplicativo. Isso é o que resolveu o erro para mim. Deparei-me com esta solução por ler alguns dos comentários de resposta de @ beckelmw.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top