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

我已经安装了 ELMAH 1.1。Net 3.5 x64在我的 ASP.NET 项目中,现在我得到了这个错误(无论何时我尝试查看任何页面) :

无法加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。

描述: 期间发生未处理的异常 当前网络的执行 请检查堆栈跟踪 有关错误的详细信息,请参阅 以及密码的来源。

例外情况详情: 异常: 可以 不加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。

底部有更多的错误详细信息。

我的活动解决方案平台是“任意 CPU”,我在 x64的 Windows7上运行,当然是在 x64的处理器上。我们之所以使用 ELMAH 的这个版本是因为1.0。Net 3.5(x86,这是唯一编译它的平台)在 x64 Windows 服务器上给出了同样的错误。

我尝试编译 x86和 x64,得到了相同的错误。我试过删除所有的编译器输出(bin 和 obj)。最后,我直接引用了 SQLite dll,这是项目在服务器上工作所不需要的,我得到了这个编译器错误:

错误1: 错误警告: 程序集生成——引用程序集‘ System.Data.SQLite.dll’针对不同的处理器 MyProject

知道是什么问题吗?

更多错误详情:

来源错误:

生成了未处理的异常 在执行当前 网上查询 异常的起源和位置 可以使用异常进行标识 下面堆栈跟踪。

堆栈追踪:

[ BadImageFormatException: 不能 加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。]
系统。反射。组装。 _ nLoad (组装名称 FileName,字符串代码库,证据 安全,安装 位置提示,堆栈爬行标记 & StackMark,Boolean 没有找到 throwOnFileNotfound,布尔值 为自省) + 0
System。反射。 Assembly.nLoad (AssemblyName FileName,字符串代码库,证据 安全,安装 位置提示,堆栈爬行标记 & StackMark,Boolean 没有找到 throwOnFileNotfound,布尔值 为自省) + 43
系统。反射。程序集。内部负载(程序集名称 证据 安全,StackCrawlMark & 自省的布尔值) + 127系统。反射。汇编。内部负载(字符串 证据 安全,StackCrawlMark & 自省的布尔值) + 142系统。反射。装配。装载(字符串 + 28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (字符串 函数名称,布尔星指令) + 46

[配置错误例外: 可以 不加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (字符串 函数名称,布尔星指令) + 613 System. Web.Configuration. CompilationSection. LoadAllAssemblesFromAppDomainBinDirectory () + 203 System. Web.Configuration. CompilationSection. LoadAssembly (AssemblyInfo Ai) + 105
System.Web.Compilation.BuildManager.GetReferencedAssembly (CompilationSection CompConfig) + 178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath ConfigPath,Boolean SupportLocalization,String OutputAssemblyName) + 54
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean + 232
System.Web.Compilation.BuildManager.CompileGlobalAsax () + 52 System。 Web。 Compilation。 BuildManager + 337

[ HttpException (0x80004005) : 不能 加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。]
System.Web.Compilation.BuildManager + 58 System。 Web。 Compilation。 BuildManager + 512 System.Web.Hosting.HostingEnvironment. 初始化(ApplicationManager 应用程序主机, IConfigMapPathFactory ConfigMapPathFactory, 主机环境参数 HostingParameter) + 729

[ HttpException (0x80004005) : 不能 加载文件或程序集 ‘ System. Data.SQLite,Version = 1.0.61.0, 文化 = 中立, PublicKeyToken = db937bc2d44ff139’或 它的一个依赖关系。一个尝试 用于加载带有 格式不正确。]
System.Web.HttpRuntime.FirstRequestInit (HttpContext + 8896783
系统 + 85
System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest Wr) + 259

189467 次浏览

您能删除您的 bin 调试文件夹并重新编译吗?

或者检查您的项目引用到 System.Data.SQLite,跟踪它的位置,然后在反射器中打开 dll。如果无法打开它,这意味着 dll 已损坏,您可能需要找到正确的 dll 或重新安装。网络架构。

System.Data.SQLite.dll是一个混合程序集,即它同时包含托管代码和本机代码。因此,一个特定的 System.Data.SQLite.dll要么是 x86,要么是 x64,但绝不能两者兼而有之。

更新(巴勃罗 · 费尔南德斯) : Cassini,当你按 F5或者点击绿色的“播放”按钮时,Visual Studio 使用的开发网络服务器,仅为 x86,这意味着即使你的工作站是 x64,你也只能使用 x86版本的 System。Data.SQLite.dll.

另一种选择是不使用卡西尼号,而是使用 IIS7,这是正确的 x64。

确保“启用32位应用程序”对于应用程序池被设置为 false。

我有一个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";
}

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

当我们的 Windows 服务器从32位操作系统转换到64位时,我得到了这个错误。抛出错误的程序集被设置为在 x86模式(即32模式)下编译。我把它换成了“任意 CPU”这招很管用。您可以通过执行以下操作来更改此值:

右键单击该项目转到 Properties -> Build -> Platform Target -> change to "Any CPU"

手动加载相关的 System.Data.SQLite 程序集可以解决这个问题。

修改了加塔皮亚的法典如下:

    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";
}

我想出了两个快速的解决方案。对我来说都可以。我认为问题出在权限上。

1)我没有使用 net-2.0目录中的 Elmah.dll 文件,而是使用 net-1.1中的 Elmah.dll。

2)我没有将 Elmah.dll 保存在项目的 bin 目录中,而是创建了一个 dll 目录将其放入其中。

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

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

另一个解决这个问题的方法是将应用程序升级到 ELMAH 1.2而不是1.1。

在我们的例子中没有工作,因为我们的生产服务器丢失了

MicrosoftVisualC + + 2010SP1可再发行包(x86)

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

作为一个不得不处理相当多的 Bug 报告的人,在 Roadkill Wiki 上面对着完全相同的问题,这是你需要做的:

  • 你用的是 x64还是 x86?Sqlite 提供了用于独立架构的 DLL ——将右边的 DLL 复制到 bin 文件夹,官方提供商有两个 DLLS: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • 如果您不想费心搜索这些程序集,那么为您的 App Pool 启用32位模式(这通常只是针对开发人员机器的解决方案)
  • 如果你在一台服务器上托管,你需要 Microsoft C + + 运行时可再发行版——默认情况下,它没有安装在 Server2008R2上。X64版本X86版本

在重新发布 SQLite 时,您必须经历多少重重困难,这真是一件令人头疼的事情。NET 二进制文件,我对 Roadkill 的解决方案最终是根据您使用的架构将正确的二进制文件复制到 ~/bin 文件夹。不幸的是,这并没有解决 C + + 运行时的问题。

如果您使用 IISExpress 作为开发机器上的 Web 服务器,我将更改为 LocalIIS。这招对我很管用。

奇怪的是,我通过安装 System 解决了这个问题。通过 Nuget GUI 应用程序实现 Data.SQLite,而不是使用包管理器控制台。

通过控制台安装不包括此库需要运行的依赖项。

我通过安装带有 Nuget 扩展名的 System.Data.SQLite 解决了这个问题。这个扩展名可以用于 VisualStudio2010或更高版本。 首先,你必须安装 Nuget 扩展,你可以这样做:

  • 转到 Visual Studio 2010,菜单-> 工具
  • 选择扩展管理器
  • 在搜索框中输入 NuGet,然后单击 Online Gallery。
  • 选择检索到的 NuGet 包管理器,单击下载。等待下载..。
  • 单击 VisualStudio 扩展安装程序 NuGet 包管理器上的 Install。等待安装完成。
  • 单击“关闭”并“立即重新启动”。

其次,现在可以安装 SQLite:

现在,您可以使用 System.Data.SQLite。

在本例中,您将看到两个文件夹 x64和 x86,这些文件夹包含 SQLite。Interop.dll.现在转到这些 dlls 的属性窗口,并设置构建操作为 content,复制到输出目录为 Copy always。

这就是我的方式。

谢谢。 Kim Tho Pham, HoChiMinh City. 电子邮件: tho.phamkim@gmail.com

System.Data.SQLite依赖于 System.Data.SQLite.interop,请确保两个包是相同的版本并且都是 X86

这是一个古老的问题,但我尝试了以上所有方法。我在做一个严格的 X86项目,所以没有两个文件夹/x86,/x64。但出于某种原因,System.Data.SQLite是一个不同的版本,以 System.Data.SQLite.interop,一旦我拉下匹配 dls 的问题得到解决。

这是一篇老文章,但它可能有助于一些人搜索这个错误,尝试设置“启用32位应用程序”为真的应用程序池。这就是为我解决错误的方法。我通过阅读对@beckelmw 的回答的一些评论得到了这个解决方案。

您可能安装了错误的软件包。您需要由实现 System 的 微软生成的包。百科。公共提供者模型。

由于所有的解决方案都不适合我,我尝试了以下方法: 我删除了这个文件夹 C: Users... . nuget package stu.system.data.sqlite.core.netFramework 然后我从 Nuget 包管理器安装了 System.Data.SQLite.Core 然后“哇! ! !”就成功了,