无法加载文件或程序集'System.Data.SQLite'

pup*_*eno 123 .net sqlite elmah

我在我的ASP.NET项目中安装了ELMAH 1.1 .Net 3.5 x64,现在我收到此错误(每当我尝试查看任何页面时):

无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.尝试加载格式不正确的程序.

描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.尝试加载格式不正确的程序.

底部有更多错误详情.

我的Active Solution平台是"任何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

任何想法可能是什么问题?

更多错误详情:

来源错误:

在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:

[BadImageFormatException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.一个试图加载程序使用不正确的格式.]
System.Reflection.Assembly._nLoad(的AssemblyName文件名,字符串的代码库,证据assemblySecurity,装配locationHint,StackCrawlMark&stackMark,布尔throwOnFileNotFound,布尔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)+127 System. Reflection.Assembly.InternalLoad(字符串assemblyString,证据assemblySecurity,StackCrawlMark&stackMark,布尔forIntrospection)142 System.Reflection.Assembly.Load(字符串assemblyString)28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串的AssemblyName,布尔starDirective)+ 46

[ConfigurationErrorsException:无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.一个试图加载程序使用不正确的格式.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串的AssemblyName,布尔starDirective)613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory()203 System.Web.Configuration .CompilationSection.LoadAssembly(集信息AI)105个
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig)178
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath用configPath,布尔supportLocalization,字符串outputAssemblyName)54
的System.Web .Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult(Boolean isPrecompiledApp)+232
System.Web.Compilation.BuildManager.CompileGlobalAsax()+52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()+337

[HttpException(0x80004005):无法加载文件或程序集'System.Data.SQLite,Version = 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

[HttpException(0x80004005):无法加载文件或程序集'System.Data.SQLite,Version = 1.0.61.0,Culture = neutral,PublicKeyToken = db937bc2d44ff139'或其依赖项之一.一个试图加载程序使用不正确的格式.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext的上下文)8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext的上下文)85
System.Web.HttpRuntime.ProcessRequestInternal(WR的HttpWorkerRequest )+259

Ant*_*hyy 119

System.Data.SQLite.dll是一个混合程序集,即它包含托管代码和本机代码.因此,特定的System.Data.SQLite.dll是x86或x64,但绝不是两者.

更新(由J. Pablo Fernandez提供):当您按F5或单击绿色"播放"按钮时,Visual Studio使用的开发Web服务器Cassini仅为x86,这意味着即使您的工作站是x64,您也只能能够使用x86版本的System.Data.SQLite.dll.

另一种方法是不使用Cassini,而是使用适当的x64的IIS7.

  • 我在x64计算机上使用x64版本. (3认同)
  • 不久之前可用的新替代方法是使用IIS Express,它允许您设置要使用的应用程序池的类型 (2认同)

bec*_*lmw 75

确保应用程序池的"启用32位应用程序"设置为false.

  • 将它设置为true实际上解决了这个问题.我猜Elmah默认使用32位sql lite程序集. (16认同)
  • 如果要在64位计算机上使用x86 dll,则此方法有效.在我们的例子中,我们的开发和生产环境不匹配,所以这是最好的. (2认同)

小智 42

去吧IIS7 Application Pool -> advanced settings and set the 32-bit application to true.


Chr*_*ris 12

如果您不使用SQLite,这非常简单:

您可以从解决方案的bin文件夹中删除SQLite DLL,然后从引用ELMAH的文件夹中删除.重建,您的应用程序将不会尝试加载您未使用的此DLL.

  • +1如果您没有使用SQLite,那么为什么还要修复引用的DLL呢?不错,优雅,正是我所需要的. (5认同)

gat*_*pia 7

我有一个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";
        }
Run Code Online (Sandbox Code Playgroud)

  • 或者[Environment.Is64BitProcess](http://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess.aspx)属性(自.NET4起). (2认同)

小智 6

我通过安装带有 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 的属性窗口,并将构建操作设置为内容,复制到输出目录为始终复制。

所以,这就是我的方式。

谢谢。Kim Tho Pham,越南胡志明市。电子邮件:tho.phamkim@gmail.com


Mar*_*eli 5

在我们的情况下不起作用,因为我们的生产服务器丢失了

Microsoft Visual C++ 2010 SP1 可再发行组件包 (x86)

我们安装了它并且一切正常。应用程序池必须将启用 32 位应用程序设置为 true,并且您必须使用 x86 版本的库


Chr*_*s S 5

作为一个不得不在 Roadkill Wiki 上处理相当多的 bug 报告并遇到完全相同问题的人,这就是您需要做的:

  • 您使用的是 x64 还是 x86?Sqlite 自带用于不同架构的 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++ 运行时问题。