定期我得到以下异常:
无法加载DLL 'SQLite.Interop.dll':无法找到指定的模块。(异常来自HRESULT: 0x8007007E)
我使用的是1.0.82.0。在VS2010, Win7 64操作系统下使用nuget安装。
一旦异常开始出现,它就会不断出现——在调试和发布中,在VS内部或外部运行应用程序。
阻止它的唯一方法就是退出并重新登录。不抛出异常并加载dll。 它可以工作几天,但之后又会坏掉。
有人见过这样的情况吗,有解决方案吗?
定期我得到以下异常:
无法加载DLL 'SQLite.Interop.dll':无法找到指定的模块。(异常来自HRESULT: 0x8007007E)
我使用的是1.0.82.0。在VS2010, Win7 64操作系统下使用nuget安装。
一旦异常开始出现,它就会不断出现——在调试和发布中,在VS内部或外部运行应用程序。
阻止它的唯一方法就是退出并重新登录。不抛出异常并加载dll。 它可以工作几天,但之后又会坏掉。
有人见过这样的情况吗,有解决方案吗?
当前回答
扩展Kugel的回答,这对我来说是有效的(VS2015 Enterprise),利用dll中的SQLite,可以在构建和测试后从主项目中删除Nuget包:
1.安装Nuget包到主项目。
Install-Package System.Data.SQLite
2.构建应用程序并测试Sqlite连接是否正常工作:
select * from sqlite_master
3.从主版本卸载Nuget包。
UnInstall-Package System.Data.SQLite
4.手动删除SQLite和EntityFramework的dll引用:
System.Data.SQLite
System.Data.SQLite.EF6
System.Data.SQLite.Linq
从主项目的“包”中删除Xml引用。配置”XML文件。
这对我来说很有效,使我的项目保持干净。
其他回答
我在运行Visual Studio Express 2013时也遇到了同样的问题。我尝试了这里和其他地方提到的几种解决方案,但都没有用。我希望这个修正能帮助到其他人。
我通过在测试基于sqlite的服务的测试类上使用deploymenttem属性来修复它。
例子:
[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{
[TestMethod]
public void SomeTestThatWasFailing_DueToThisVeryIssue()
{
// ... test code here
}
}
这将导致所需的SQLite.Interop.dll被复制到适当的“TestResults”文件夹中的x86目录。
全是绿色的。一切都很好。
我正在做一个简单的控制台应用程序,向SQLite数据库添加一些测试数据,并得到这个错误。项目的配置是“Any CPU”。我通过将SQLite.Interop.dll复制到bin\debug文件夹来修复它。更好的方法是使用@Wil的方法,但是如何为“任何CPU”配置指定该方法呢?
我有这个问题,因为我正在使用的dll有Sqlite作为依赖项(在NuGet中配置只有Sqlite核心包)。该项目编译并复制除' Sqlite . interop .dll' (x86和x64文件夹)之外的所有Sqlite dll。
解决方案非常简单:只需将System.Data.SQLite.Core包作为依赖项(使用NuGet)添加到您正在构建/运行的项目中,dll就会被复制。
来自NuGet的多体系结构(x86, x64)版本SQLite的默认安装显示了您所描述的行为。如果你想加载。net运行时选择在你的机器上运行你的应用程序的实际体系结构的正确版本,那么你可以给DLL加载器一个关于在哪里找到正确库的提示,如下所示:
在Program.Main()之前添加kernel32.dll函数调用SetDLLDirectory()的声明:
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, SetLastError = true)]
[return: System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.Bool)]
static extern bool SetDllDirectory(string lpPathName);
然后使用您自己的方法确定正确的子目录,以找到'SQLite.Interop.dll'的特定于体系结构的版本。我使用以下代码:
[STAThread]
static void Main()
{
int wsize = IntPtr.Size;
string libdir = (wsize == 4)?"x86":"x64";
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
SetDllDirectory(System.IO.Path.Combine(appPath, libdir));
当您处于这种状态时,尝试执行Rebuild-All。如果这解决了问题,您可能会遇到与我相同的问题。
一些背景(我的理解):
SQLite has 1 managed assembly (System.Data.SQLite.dll) and several platform specific assemblies (SQLite.Interop.dll). When installing SQLite with Nuget, Nuget will add the platform specific assemblies to your project (within several folders: \x86, \x64), and configures these dlls to "Copy Always". Upon load, the managed assembly will search for platform specific assemblies inside the \x86 and \x64 folders. You can see more on that here. The exception is this managed assembly attempting to find the relevant (SQLite.Interop.dll) inside these folders (and failing).
我的情况:
我的解决方案中有两个项目;一个WPF应用程序和一个类库。WPF应用程序引用类库,类库引用SQLite(通过Nuget安装)。
对我来说,问题是当我只修改WPF应用程序时,VS试图进行部分重建(意识到依赖的dll没有改变)。在这个过程的某个地方,VS清理了\x86和\x64文件夹的内容(清除了SQLite.Interop.dll)。当我做一个完整的Rebuild-All时,VS正确地复制文件夹及其内容。
我的解决方案:
为了解决这个问题,我添加了一个Post-Build进程,使用xcopy强制将\x86和\x64文件夹从类库复制到我的WPF项目\bin目录。
或者,您可以使用构建配置/输出目录做一些更花哨的事情。