.net - net - elmah microsoft




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

Eu instalei o ELMAH 1.1 .Net 3.5 x64 no meu projeto ASP.NET e agora estou recebendo este 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 foi originado no código.

Detalhes da exceção: System.BadImageFormatException: não foi possível carregar 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.

Mais detalhes de erro na parte inferior.

Minha plataforma Active Solution é "Any CPU" e estou rodando em um x64 Windows 7 em um processador x64, é claro. O motivo pelo qual estamos usando esta versão do ELMAH é porque o 1.0 .Net 3.5 (x86, que é a única plataforma para a qual ele é compilado) nos forneceu o mesmo erro em nosso servidor x64 do Windows.

Eu tentei compilar para x86 e x64 e recebo o mesmo erro. Eu tentei remover toda a saída do compilador (bin e obj). Por fim, fiz uma referência direta à DLL do SQLite, algo que não era necessário para o projeto funcionar no servidor e recebi este 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 a localização da exceção podem ser identificadas usando o rastreamento de pilha de exceção abaixo.

Rastreamento 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, código de cadeia StringBase, Evidence assemblySecurity, localização de montagemHint, StackCrawlMark & ​​stackMark, throwOnFileNotFound booleano, Boolean forIntrospection) +0
System.Reflection.Assembly.nLoad (nome_da_montagem nome_do_arquivo, código_de_string de código, conjunto de evidências de segurança, localização de montagemHint, StackCrawlMark & ​​stackMark, throwOnFileNotFound booleano, Booleano paraIntrospecção) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark e stackMark, Boolean paraIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark e stackMark, Boolean paraIntrospection) +142 System.Reflection.Assembly. 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, suporte booleanoLocalization, 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 (AppManager do ApplicationManager, appHost do IApplicationHost, 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 (HttpWorkerRequest wr) +259


Certifique-se de que "Ativar aplicativos de 32 bits" esteja definido como falso para o pool de aplicativos.


Como alguém que teve que lidar com alguns relatos de bugs no Wiki do Roadkill com exatamente o mesmo problema, isso é o que você precisa fazer:

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

É muito difícil saber quantos aros você tem que superar ao redistribuir os binários do SQLite .NET, mas a minha solução para o Roadkill foi copiar os binários corretos para a pasta ~ / bin com base na arquitetura que você usa . Infelizmente isso não resolve o problema de tempo de execução do C ++.


Eu criei duas soluções rápidas. Ou trabalhe 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 Elmah.dll da net-1.1.

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


Eu recebi este erro quando o nosso servidor do windows foi convertido do sistema operacional de 32 bits para 64 bits. O assembly que estava lançando o erro foi configurado para compilar no modo x86 (ou seja, modo 32). Eu mudei para "Qualquer CPU" e que fez o truque. Você pode alterar esse valor fazendo o seguinte:

clique com o botão direito do mouse no projeto e acesse Properties -> Build -> Platform Target -> change to "Any CPU"


Eu resolvi isso, curiosamente, instalando o System.Data.SQLite através do aplicativo Nuget, ao contrário do console do gerenciador de pacotes.

A instalação por meio do console não incluiu as dependências que essa biblioteca precisa executar.


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


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

Alterou o código do gatapia como 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";
    }

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


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


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


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

Update ( cortesia de J. Pablo Fernandez ): Cassini, o servidor web de desenvolvimento usado pelo Visual Studio quando você pressiona F5 ou clica no botão verde «play», é x86, o que significa que mesmo que sua estação de trabalho seja x64, você só será 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.