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

时间:2013-08-12 06:48:34

标签: c# winforms system.data.sqlite

(这是一个重复的问题,已在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)              在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可再发行组件包(x86),也尝试过2005年版)。完成。

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

  

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

更新:(阅读答案和评论后)
尝试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。

经过上述尝试后,结果仍然相同。应用程序可以正常从我的计算机运行,但无法在另一台计算机上运行。

这是一个开源免费软件简单电话簿。我已经提交并上传了最新的源代码到它的源控制服务器:
http://simpb.codeplex.com/SourceControl/list/changesets(变更号码:fd847ac6c406)

5 个答案:

答案 0 :(得分:6)

由于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>

它应该可以正常工作。

答案 1 :(得分:5)

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

短篇小说:
使用旧版本的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构建(这是我正在寻找的),但我没有建立解决方案。发生一些构建错误。我没有花时间调试它。

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

我认为 V1.0.88 包含错误,但我可能错了。无论如何,就目前的解决方案而言,我只是坚持 V1.0.66

答案 2 :(得分:1)

自x64 / x86机器中的v1.0.66以来,我也遇到过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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

相关问题