130

我已经在我的 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,版本=1.0.61.0,Culture=neutral,PublicKeyToken=db937bc2d44ff139”或其依赖项之一。试图加载格式不正确的程序。

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

我的活动解决方案平台是“任何 CPU”,我在 x64 Windows 7 上运行 x64,当然,处理器。我们使用这个版本的 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,版本=1.0.61.0,文化=中性,PublicKeyToken=db937bc2d44ff139”或其依赖项之一。试图加载格式不正确的程序。]
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, Boolean for Introspection) +127 System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean for Introspection) +142 System.Reflection.Assembly。加载(字符串程序集字符串)+28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(字符串程序集名称,布尔星指令)+46

[ConfigurationErrorsException:无法加载文件或程序集“System.Data.SQLite,版本=1.0.61.0,Culture=neutral,PublicKeyToken=db937bc2d44ff139”或其依赖项之一。试图加载格式不正确的程序。]
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, 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):无法加载文件或程序集“System.Data.SQLite,版本=1.0.61.0,文化=中性,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,版本=1.0.61.0,文化=中性,PublicKeyToken=db937bc2d44ff139”或其依赖项之一。试图加载格式不正确的程序。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +85
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr ) +259

4

19 回答 19

125

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

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

另一种方法是不使用 Cassini,而是使用正确为 x64 的 IIS7。

于 2009-08-15T13:27:24.373 回答
80

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

于 2009-09-09T15:48:34.583 回答
45

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

于 2010-11-27T10:21:13.370 回答
15

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

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

于 2011-09-27T18:23:30.567 回答
9

我有一个 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";
        }
于 2010-05-10T23:06:43.510 回答
6

我通过安装带有 Nuget 扩展的 System.Data.SQLite 解决了这个问题。此扩展可用于 Visual Studio 2010 或更高版本。首先,您必须安装 Nuget 扩展。你可以在这里关注:

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

其次,现在,您可以安装 SQLite:

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

在这种情况下,您会看到两个文件夹 x64 和 x86,这些文件夹包含 SQLite.Interop.dll。现在转到这些 dll 的属性窗口并设置构建操作为内容,复制到输出目录始终为复制。

所以,这就是我的方式。

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

于 2015-12-30T03:45:39.967 回答
5

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

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

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

于 2012-09-06T12:25:58.327 回答
5

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

  • 您使用的是 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++ 运行时问题。

于 2013-01-03T20:23:13.923 回答
4

当我们的 Windows 服务器从 32 位操作系统转换为 64 位时,我收到了这个错误。引发错误的程序集设置为在 x86 模式(即 32 模式)下编译。我将它切换到“任何 CPU”,然后就成功了。您可以通过执行以下操作更改此值:

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

于 2010-12-10T17:59:40.273 回答
4

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

更改了 gatapia 的代码如下:

    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";
    }
于 2011-01-10T05:17:05.047 回答
3

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

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

于 2015-06-08T10:58:05.500 回答
3

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

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

于 2016-04-13T08:58:47.413 回答
1

我想出了 2 个快速解决方案。要么为我工作。我认为问题是因为权限。

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

2)而不是将 Elmah.dll 保留在项目 bin 目录中。我创建了一个 dll 目录来放置它。

于 2011-09-01T20:43:59.250 回答
1

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

于 2012-06-27T18:06:15.690 回答
0

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

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

于 2009-08-14T16:49:59.143 回答
0

如果您在开发机器上使用 IIS Express 作为 Web 服务器,我会更改为本地 IIS。这对我有用。

于 2015-02-04T16:58:34.450 回答
0

这是一篇旧帖子,但它可能会帮助一些搜索此错误的人尝试将应用程序池的“启用 32 位应用程序”设置为 True。这就是为我解决错误的原因。我通过阅读对@bekelmw 答案的一些评论来找到这个解决方案。

于 2018-06-08T14:53:00.320 回答
0

您可能安装了错误的软件包。您需要由Microsoft生产的实现 System.Data.Common 提供程序模型的包。

于 2018-08-30T16:50:38.027 回答
0

由于所有解决方案都不适合我,我尝试了这个:我删除了这个文件夹 C:\Users....nuget\packages\stub.system.data.sqlite.core.netframework 然后我安装了 System.Data.SQLite。 Nuget 包管理器的核心和“哇!!!!” 有用,

于 2021-10-08T13:52:45.433 回答