17

(这是 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 Redistributable Package (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)

4

5 回答 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 构建(这是我正在寻找的),但我无法构建解决方案。发生一些构建错误。我没有花时间调试它。

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

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

于 2013-08-12T14:05:59.700 回答
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>

它应该可以正常工作。

于 2013-08-12T10:29:43.653 回答
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
于 2014-02-06T08:04:30.810 回答
1

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

于 2015-04-02T03:44:22.843 回答
0

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

于 2014-12-08T07:51:27.663 回答