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

18

(这是一个在stackoverflow.com上被重复提出的问题。我已经阅读了答案,尝试了解决方案,但没有解决我的问题。我将解释我的问题和我所做的事情。)

这就是我的问题:

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

System.IO.FileLoadException: 无法加载文件或程序集“System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或其中之一的依赖项。应用程序无法启动,因为其并行配置不正确。请参阅应用程序事件日志或使用命令行 sxstrace.exe 工具获取详细信息。(HRESULT 的异常:0x800736B1) 文件名:“System.Data.SQLite, Version=1.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139” ---> System.Runtime.InteropServices.COMException (0x800736B1): 应用程序无法启动,因为其并行配置不正确。请参阅应用程序事件日志或使用命令行 sxstrace.exe 工具获取详细信息。(HRESULT 的异常:0x800736B1) at SimPB.config.PrepareDatabase() at SimPB.config.InitializeProgram() at 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>

完成。

Attempt 4:尝试关闭另一台计算机上的用户账户控制(User Account Control)。已完成。

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

Attempt 6:尝试重新安装.NET Framework 2.0 SP2。收到错误信息:

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

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

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

Attempt 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文件夹中。 - Vinay Pratap Singh Bhadauria
你确定另一台电脑不是运行64位的吗? - SWeko
@SWeko,我确定另一台计算机没有运行64位系统。顺便问一下,你能帮我验证一下这个应用程序能否在你的计算机上运行吗?你是否收到了相同的错误信息?谢谢。下载链接:http://simpb.codeplex.com/releases - mjb
嗯... 不确定汇编解析器查找顺序,但您可以检查它是否在输出目录之前在GAC中查找程序集,如果是,则删除其中任何SQLite程序集。 - Gaute Løken
@Mithon 你好,由于我打算开发便携式软件,因此在GAC中安装程序集不是解决方案,但还是感谢你的建议 :) 我已经解决了这个问题,你可以看到我的答案。 - mjb
5个回答

9
我已经解决了这个问题。我是这样解决的:
简短的故事:使用旧版的System.Data.SQLite。新版本被怀疑有漏洞(可能我错了)。
长篇故事:我开始回想起我的以前的旧版本程序为什么可以在其他计算机上执行,而这个新版本却不能。我做出了哪些明显的改变?
是的,我改变了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(这正是我想要的),但我未能构建该解决方案。出现了一些构建错误。我没有花时间去调试。
由于仍有使用 Windows XP 的用户,我需要为 .NET Framework 2.0 开发程序。
我假设 V1.0.88 存在漏洞,但我可能是错误的。无论如何,对于当前的解决方案,我只使用 V1.0.66

7
由于您的.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>

它在你的机器上运行正常,因为你确实在那个位置有.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>

并且它应该能够正常工作。

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

1
我在x64/x86机器上使用SQLite自v1.0.66以来一直遇到问题。我从未能够通过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

1
在您的App.config文件中,在<configuration>元素内添加以下行:
<runtime> <loadFromRemoteSources enabled="true"/> </runtime>

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接