System.IO.FileLoadException:无法加载文件或程序集';System.Data.SQLit
本文关键字:System 程序集 SQLit Data 文件 FileLoadException IO 加载 | 更新日期: 2023-09-27 18:27:12
(这是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,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)
我已经解决了这个问题。这就是我解决的方法
短篇小说:
使用旧版本的System.Data.SQLite。怀疑新版本有错误(我可能错了)。
长话短说:
我开始回忆起为什么我以前的旧版本的这个程序可以在其他计算机上执行,而这个新版本不能。我做了哪些明显的改变?
是的,我已经更改了System.Data.SQLite.的版本
此程序使用的System.Data.SQLite的旧版本是V1.0.66。我使用的新版本是2013年8月8日发布的最新版本:V1.0.88。(是的,大约是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.SQL ite.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.
由于.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>
它应该可以正常工作。
我在x64/x86机器中自v1.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
在App.config文件中,在<configuration>
元素内添加以下行:<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
检查MS Visual C++是否运行可再发行安装,因为System.Data.SQLite依赖于它。