Não foi possível carregar arquivo ou assembly 'System.Data.SQLite'
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 geradadurante 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
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:
- Vá até a opção Ferramentas Menu> Biblioteca Package Manager-> Package Manager Console do Visual estúdio.
- Em seguida, execute o comando Install-Package System.Data.SQLite em Package Manager Console. Como isso: executar o comando Install-Package System.Data.SQLite em Package Manager Console
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.