【问题标题】:System.IO.FileLoadException: Could not load file or assembly 'System.Data.SQLiteSystem.IO.FileLoadException:无法加载文件或程序集“System.Data.SQLite”
【发布时间】:2013-08-13 09:53:20
【问题描述】:

(这是一个重复的问题,已在 stackoverflow.com 中提出。我已阅读答案。我尝试了解决方案,但这并没有解决我的问题。我将解释我的问题是什么以及我做了什么)。

这是我的问题:

我的应用程序使用了 System.Data.SQLite.DLL。我引用它并在我的计算机上正常运行,但它无法在另一台计算机上运行。这是错误信息:

System.IO.FileLoadException:无法加载文件或程序集 'System.Data.SQLite,版本=1.0.88.0,文化=中性, PublicKeyToken=db937bc2d44ff139' 或其依赖项之一。 应用程序无法启动,因为它并排
配置不正确。请看申请活动 登录或使用命令行 sxstrace.exe 工具了解更多详细信息。
(来自 HRESULT 的异常:0x800736B1)文件名:'System.Data.SQLite, 版本=1.0.88.0,文化=中性,PublicKeyToken=db937bc2d44ff139' ---> System.Runtime.InteropServices.COMException (0x800736B1): 应用程序无法启动,因为它并排
配置不正确。请查看应用程序事件日志或 使用命令行 sxstrace.exe 工具了解更多详细信息。
(来自 HRESULT 的异常:0x800736B1) 在 SimPB.config.PrepareDatabase() 在 SimPB.config.InitializeProgram() 在 SimPB.Program.Main()

我的电脑运行的是 Windows 7 32 位,Visual Studio 2010。

另一台计算机也在运行 Windows 7 32 位,但未安装 Visual Studio。

我尝试过的:

尝试 1: 确保应用程序是使用 Release + x86 构建的,并且应用程序是使用目标框架构建的:.NET Framework 2.0。完成。

尝试 2: 确保引用的应用程序使用正确的 System.Data.SQLite 构建,即 x86 + .Net Framework 2.0 (sqlite-netFx20-binary-Win32-2005-1.0. 88.0)。完成

尝试 3: 在 App.config 中尝试这些代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

还有这个

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
  </runtime>
</configuration>

还有这个

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

完成。

尝试 4: 尝试在另一台计算机上关闭用户帐户控制。完成。

尝试 5: 尝试在另一台计算机上安装 Visual C++ Runtime(我安装了 Visual Microsoft Visual C++ Runtime 2010 Redistributable Package (x86),也尝试了 2005 版。)。完成。

尝试 6: 尝试重新安装 .NET Framework 2.0 SP2。接收错误:

您必须使用控制面板中的“打开或关闭 Windows 功能” 安装或配置 Microsoft .NET Framework 2.0 SP2。

更新:(阅读答案和 cmets 后)
尝试 7: 确保 System.Data.SQLite.DLL 位于输出 bin 文件夹中。完成

尝试 8:再次确认另一台计算机正在运行 32 位 Windows 7。完成

尝试 9: 更改 .csproj 文件中的 HintPath 声明:
改变这个:

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
</Reference>

到这里:

<Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
  <HintPath>..\System.Data.SQLite.dll</HintPath>
</Reference>

第 9 次尝试完成。

经过以上尝试,结果还是一样。该应用程序可以在我的计算机上正常运行,但在另一台计算机上运行失败。

这是一个开源的免费软件,Simple Phone Book。我已将最新的源代码提交并上传到它的源代码控制服务器:
http://simpb.codeplex.com/SourceControl/list/changesets(变更集编号:fd847ac6c406)

【问题讨论】:

  • 检查这个 dll(System.Data.SQLite.DLL) 是否被复制并出现在你的 bin 文件夹中
  • 您确定另一台计算机没有运行 64 位吗?
  • @SWeko,是的,我确定另一台计算机没有运行 64 位。顺便问一下,您能帮我验证一下该应用程序是否可以在您的计算机上运行?您是否收到相同的错误消息?谢谢。可在此处下载:simpb.codeplex.com/releases
  • 嗯.. 不确定程序集解析器查看的顺序是什么,但您可以检查它是否在输出目录之前在 GAC 中查找程序集,如果是,则从那里删除任何 SQLite 程序集。
  • @Mithon 您好,由于我的目标是开发便携式软件,因此在 GAC 中安装程序集不是解决方案,但我感谢您的建议 :) 我已经解决了问题,您可以请参阅下面的答案。

标签: c# winforms system.data.sqlite


【解决方案1】:

我已经解决了这个问题。我就是这样解决的:

短篇小说:
使用旧版本的 System.Data.SQLite。新版本怀疑有bug(我可能是错的)。

长篇大论:
我开始回想为什么我以前的这个程序的旧版本可以在其他计算机上执行而这个新版本不能。我做了哪些明显的改变?

是的,我已经更改了 System.Data.SQLite 的版本。

本程序使用的System.Data.SQLite旧版本为V1.0.66。我使用的新版本是最新版本:V1.0.88,发布于2013年8月8日。 (是的,距今天大约 4 天前)。阅读更多:http://system.data.sqlite.org/index.html/timeline

然后我决定放弃新版本(V1.0.88)并使用旧版本(V1.0.66),一切恢复正常。该程序再次可以在另一台计算机上执行。

我试图查看V1.0.88的源代码,但我没有找到导致问题的代码行。我能发现的最好的是 System.Data.SQLite.Interop 项目。当我在 Visual Studio 2010 中加载解决方案时,System.Data.SQLite.Interop 预设为针对 .NET Framework 4.0 构建。我不知道如何改变它。后来,我在 Visual Studio 2008 中重新加载了解决方案,System.Data.SQLite.Interop 的常见属性表明它将为 .NET Framework 2.0 构建(这正是我正在寻找的),但我无法构建解决方案。发生一些构建错误。我没有花时间调试它。

我需要为 .NET Framework 2.0 开发程序,因为有些用户还在使用 Windows XP。

我假设 V1.0.88 包含错误,但我可能错了。无论如何,至于目前的解决方案,我只是坚持V1.0.66

【讨论】:

    【解决方案2】:

    由于your .csproj file 中的 HintPath 声明,无法定位程序集:

    <Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
      <HintPath>E:\Developer Soft\SQLite\sqlite-netFx20-binary-bundle-Win32-2005-1.0.88.0\System.Data.SQLite.dll</HintPath>
    </Reference>
    

    它可以在您的机器上运行,因为您在该位置确实有 .dll。但是,其他人可能想要使用您放置在存储库根目录中的 System.Data.SQLite.dll 文件。由于这是 .csproj 的上一级,因此您可以使用相对路径,如下所示:

    <Reference Include="System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
      <HintPath>..\System.Data.SQLite.dll</HintPath>
    </Reference>
    

    它应该可以正常工作。

    【讨论】:

    • 您好,我已经尝试了您的建议。但问题仍然存在。不过,我已经解决了这个问题。我自己已经回答了这个问题。无论如何谢谢你的帮助:) 祝你好运
    【解决方案3】:

    自 v1.0.66 以来,我在 x64/x86 机器上也遇到了 SQLite 问题。我一直无法使用 nuget 包安装 ServiceStack 和 SqLite.x86 并让它开箱即用。

    但是今天我已经成功地改变了安装过程,它可能对你来说也是一个解决方案。我怀疑问题始终是 System.Data.SQlite 的版本与 Servicestack.Ormlite.SqliteNET 期望的版本不一致。

    Nuget 控制台中的下一个过程让我可以正常工作:

    Install-Package System.Data.Sqlite.x86 -Version 1.0.88.0
    Install-Package ServiceStack -Version 3.9.71
    Install-Package ServiceStack.OrmLite.Sqlite32 -Version 3.9.71
    

    【讨论】:

      【解决方案4】:

      在您的 App.config 文件中,将这些行添加到 &lt;configuration&gt; 元素中:
      <runtime> <loadFromRemoteSources enabled="true"/> </runtime>

      【讨论】:

        【解决方案5】:

        检查 MS Visual C++ 是否运行可再发行安装,因为 System.Data.SQLite 依赖于它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-19
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 2011-03-24
          • 2019-06-06
          • 1970-01-01
          相关资源
          最近更新 更多