无法加载DLL“SQLite.Interop.dll”

定期我收到以下exception:

Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

我正在使用1.0.82.0。 版本,在VS2010中安装Nuget,OS Win7 64。

一旦exception开始出现,它会不断出现 – 在VS内部或外部debugging和发布和运行应用程序。

停止它的唯一方法是注销和login。 不会引发exception,并加载dll。 它可以工作几天,但它可以再次打破。

有没有人看到这样的事情,有没有解决scheme?

我知道我迟到了,但是我在今天取消了最新的x86 / x64版本(版本1.0.88.0)后就遇到了这个问题。 我VS2012中的本地IIS在默认情况下运行32位,没有简单的方法切换到x64。 我的生产服务器运行64位。

无论如何,我安装了NuGet包到一个DLL项目,我得到了这个错误。 我必须要做的,我必须安装到主站点项目。 即使它根本不触碰SQLite类。

我的猜测是,SQLite使用入口程序集来检测要加载哪个版本的Interop。

在平台目标是Any CPU的WPF项目中使用SQLite时,我遇到了同样的问题。 我通过以下步骤来修复它:

  1. 在Visual Studio中打开项目devise器。 关于如何做的细节可以在这里find。
  2. 点击Build选项卡。
  3. 禁用prefer 32-bit选项。

或者,您可以将平台目标设置为x86x64 。 我认为这个问题是由System.Data.SQLite库使用平台目标来获取'SQLite.Interop.dll'文件的位置引起的。

更新:

如果无法访问项目devise器,只需从文本编辑器中打开项目( *.csproj )文件,然后将值<Prefer32Bit>false</Prefer32Bit><PropertyGroup>...</PropertyGroup>标记中。

示例代码

 <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProjectGuid>[Set by Visual Studio]</ProjectGuid> <OutputType>Exe</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>[Set by Visual Studio]</RootNamespace> <AssemblyName>[Set by Visual Studio]</AssemblyName> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <FileAlignment>[Set by Visual Studio]</FileAlignment> <!--Add the line below to your project file. Leave everything else untouched--> <Prefer32Bit>false</Prefer32Bit> </PropertyGroup> 

我有这个问题,因为我使用的DLL有Sqlite作为依赖项(在NuGet中configuration只有Sqlite核心包)。 该项目编译和复制除“SQLite.Interop.dll”(x86和x64文件夹)之外的所有Sqlite dll-s。

解决scheme非常简单:只需将Sqlite.Core包作为依赖(使用NuGet)添加到正在构build/运行的项目中,即可复制dll。

这是我如何在我的项目中解决它。

这是工作,当一个同事提交他的更改,我收到“无法加载DLL”SQLite.Interop.dll“”例外。

对项目的.csproj文件进行分解,这是在非工作版本中:

 <ItemGroup> <Content Include="x64\SQLite.Interop.dll" /> <Content Include="x86\SQLite.Interop.dll" /> </ItemGroup> 

这就是WORKING版本所具有的:

 <ItemGroup> <Content Include="x64\SQLite.Interop.dll"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> <Content Include="x86\SQLite.Interop.dll"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup> 

恢复后,我没有收到exception。 DLL文件被转储到适当的Debug \ x64(etc)文件夹中。

当你进入这个状态时,尝试执行一个Rebuild-All。 如果解决了这个问题,你可能会遇到同样的问题。

一些背景(我的理解)

  • SQLite有1托pipe程序集(System.Data.SQLite.dll)和几个特定于平台的程序集(SQLite.Interop.dll)。 当使用Nuget安装SQLite时,Nuget会将特定于平台的程序集添加到项目中(在几个文件夹中:\ x86,\ x64),并将这些dllconfiguration为“始终复制”。

  • 加载后,托pipe程序集将在\ x86和\ x64文件夹中search特定于平台的程序集。 你可以在这里看到更多。 这个托pipe程序集例外是试图在这些文件夹(和失败)中查找相关的(SQLite.Interop.dll)。

我的情景

我有两个项目在我的解决scheme; 一个WPF应用程序和一个类库。 WPF应用程序引用类库,而类库引用SQLite(通过Nuget安装)。

我的问题是,当我只修改WPF应用程序,VS试图做部分重build(意识到相关的DLL没有改变)。 在这个过程中的某个地方,VS会清除\ x86和\ x64文件夹的内容(吹走SQLite.Interop.dll)。 当我完成全部重build时,VS会正确复制文件夹及其内容。

我的解决scheme

为了解决这个问题,我最终添加了一个使用xcopy的Post-Build过程来强制将\ x86和\ x64文件夹从类库复制到我的WPF项目\ bin目录中。

或者,你可以用构buildconfiguration/输出目录做更有趣的事情。

我有运行Visual Studio Express 2013相同的问题。我尝试了几个解决scheme在这里和其他地方提到无济于事。 我希望这个修复可以帮助别人。

我通过在testing基于SQLite的服务的testing类上使用DeploymentItem属性来修复它。

例:

 [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目录。

一切都是绿色的。 一切都很好。

Tools -> Extension and updates更新NuGet Tools -> Extension and updates并重新安装SQLite.Core命令PM> Update-Package -reinstall System.Data.SQLite.Core Tools -> Extension and updates重新安装PM> Update-Package -reinstall System.Data.SQLite.Core为我修复它。

这里真的有很多答案,但是我的简单明了, 没有GAC玩法

问题是,可执行文件需要一个正确的SQLite.Interop.dll (x86或x64)的副本来访问我们的数据库。

大多数体系结构都有层,在我的情况下, 数据层具有SQLite连接所需的DLL。

所以我简单地把后期构build脚本放入我的数据层解决scheme,一切正常。


TL; DR;

  1. 在构build选项中将解决scheme的所有项目设置为x86x64
  2. 使用SQLite nuget Package将以下Post-Build-Script添加到项目中:

    xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y

当然,你必须改变Release Buildx86版本的脚本。


STL; DR;

将您的SQLite.Interop.dll放在*.exe文件旁边。

NuGet的多体系结构(x86,x64)版本SQLite的默认安装展现了您所描述的行为。 如果你想加载.NET运行时select在你的机器上运行你的应用程序的实际架构的正确版本,那么你可以给DLL加载器提示如何find正确的库,如下所示:

在您的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)); 

我在多个项目解决scheme中遇到了类似的问题。 SQLite.Interop.dll是使用ClickOnce随软件分发的其中一个插件所必需的。

至于在Visual Studio中的debugging一切正常,但部署的版本是缺less文件夹x86 /和x64 /包含该DLL。

使用ClickOnce进行部署后,解决scheme是在解决scheme的启动项目(也是正在发布的)中创build这两个子文件夹,将它们复制到它们中,并将它们设置为Content Copy Always。

通过这种方式,ClickOnce发布工具会自动在清单中包含这些文件和文件夹,并随软件一起部署

即使它是一个旧的post,我想分享我在这里find的解决scheme: http : //system.data.sqlite.org/index.html/info/54e52d4c6f

如果您不想读取所有问题,则解决scheme是将文件“msvcr100.dll”(可在Windows \ System32目录中find)复制到与SQLite.Interop.dll相同的path中。

我会build议阅读这个问题,以理解为什么,并将文件包括在您的设置,但要安装它只有当错误发生,我把它设置选项中可选的组件选项。

HTH,Formentz

我已经开始使用Costura.Fody来打包(.net)程序集并embedded和预加载本地dll。 这也有助于以后的发行,因为你可以发送一个文件。

  1. 从Nuget安装Costura Fody。

  2. 在C#项目中创build一个名为costrua32的文件夹。 在那里添加任何C#的本地dll加载。

  3. 一旦你将它们添加到这个文件夹。 点击属性窗口,将构build操作更改为“embedded式资源”

  4. 最后,您需要修改名为FodyWeavers.xml的XML文件,如下所示。 这里我指定首先加载sql dll。 (注意你放弃.dll)

     Weavers Costura PreloadOrder SQLite.Interop tbb_debug tbb /PreloadOrder> /Costura /Weavers 

这样做的好处是,您不必编写任何事先或事后编译事件,并且最终产品完全封装在一个更大的文件中。

如果您下载正确的SQLite 二进制文件 ,然后根据您的项目生成选项将SQLite.Interop.dll复制到您的发布debugging文件夹。

我一直在努力,偶尔我发现testing设置是不正确的。 看到这个图像: 测试设置

我只是取消选中testing设置,问题就消失了。 否则,将发生exception。 希望这会帮助别人。 不知道这是根本原因。

我不知道为什么还没有包括这个,但是我不得不做这个研究,为自己find答案,所以希望有人能find答案,省去麻烦。 这是一个WPF应用程序。 它工作得很好,我的Dev框,但没有在我复制它的计算机上工作,并得到Unable to load DLL 'SQLite.Interop.dll'错误。 当我运行它时,我得到与OP一样的错误,直接从我的“debugging”文件夹移动到其他计算机的所有相关的目录和文件。 包含我的DLL的“bin”文件夹已被复制到“Debug \ bin”中,并且当我使用此path复制到另一台计算机时,我的应用程序文件中包含了所有文件,所以它不会丢失任何文件。

我在其他答案中看到的情况并不适用:

  • 我没有使用NuGet包,或者需要创buildNuGet包创build的x86或x64文件夹。 我的DLL(System.Data.SQLite和SQLite.Interop.dll,以及System.Data.SQLite.config)位于我的项目的“bin”文件夹中,并手动复制(在解决scheme资源pipe理器中创build“bin”文件夹VS,在Windows资源pipe理器中将DLL粘贴到此文件夹中,使用Add> Existing Item将文件放入VS文件夹/项目中)。 然后,我将它们作为引用程序集在我的项目中使用该位置(“参考”>“添加引用”,并浏览到一个, 冲洗,其余的重复 )。 这确保了我的项目确切地知道他们在哪里。
  • 我不需要在我的app.config中引用任何SQLite DLL文件,甚至可以触摸我的MyProject.csproj文件。
  • 我甚至不需要指定一个特定的处理器! 我的项目的构build是为“任何CPU”,即使我只有混合或64位的DLL,只能运行在Windows 7 +,这是64位操作系统。 (没有x86-only / 32-bit only DLL)
  • 当我遇到OP的错误时,我已经将这些DLL指定为“内容”和“如果更新”。

我发现这是从https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20

(11)当我试图运行我的应用程序时,为什么会得到一个DllNotFoundException(对于“sqlite3.dll”或“SQLite.Interop.dll”)?

无法find指定的dynamic链接库(DLL),或者由于缺less依赖关系而无法装入。 确保指定的dynamic链接库位于应用程序目录或系统PATH中的目录中,然后重试。 此外,请确保已经安装了必要的Visual C ++运行时可再发行组件,除非您正在使用静态链接到它的dynamic链接库。

重点放在段落内的粗体部分。 目标计算机是新鲜的,没有加载除.NET 4.0以外的程序。 一旦我安装了C ++,就可以完成对SQLite的命令。 这应该是第一个常见问题和部分先决条件之一,但它被埋在#11。 我的开发计算机已经加载,因为它与Visual Studio,所以这就是为什么它在那里工作。

下载:
适用于Visual Studio 2015的Visual C ++可再发行组件:
https://www.microsoft.com/en-us/download/details.aspx?id=48145

更新3(累积更新):
https://www.microsoft.com/en-us/download/details.aspx?id=53587

正如SQLite wiki所说,你的应用程序部署必须是:

应用程序部署

所以你需要遵守规则。 find与您的目标平台相匹配的dll并将其放置在位置中,如图所示。 Dll可以在YourSolution / packages / System.Data.SQLite.Core。%version%/中find。

我有应用程序部署的问题,所以我只是将正确的SQLite.Interop.dll添加到我的项目中,添加x86文件夹到安装项目中的AppplicationFolder,并添加文件引用到DLL。

我不知道这是否是一个好的答案,但是我可以通过在“本地系统”身份的AppDomain下运行我的应用程序来解决这个问题。

我正在一个简单的控制台应用程序中添加一些testing数据到SQLite数据库,并得到这个错误。 该项目的configuration是“任何CPU”。 我通过将SQLite.Interop.dll复制到bin \ debug文件夹来修复它。 更好的方法是使用@Wil的方法,但是如何为“任何CPU”configuration指定?

你也可以得到这个错误,如果你试图在64位项目中运行一个32位的DLL。

当我在x86和x64文件夹中放置相同的文件(32位版本的SQLite.Interop.dll)时,我得到了这个。

会议有争议吗? 检查是否有另一个应用程序与DLL上的文件locking。

如果这是原因,那么应该很容易使用像Sysinternal的Process Explorer这样的工具来发现有问题的程序。

HTH,粘土

有关查看此问题的任何人的参考:

如果你使用nuget包,它会安装一个构build规则来为你做复制。 (请参阅System.Data.SQLite.Core.1.0.94.0 \ build – 或者您安装的任何Core版本)。

nuget安装程序自动将规则添加到项目文件中。

这仍然不能解决testing用例问题。 DeploymentItem( https://stackoverflow.com/a/24411049/89584 )方法是似乎在那里工作的唯一的东西。

我有这个问题,因为Visual C ++ 2010可再发行组件没有安装在我的PC。如果你还没有安装Visual C ++ 2010的可再发行组件下载并安装这个(检查x86或64 dll)。

我遇到了这个问题,在一个带有WebAPI / MVC5 Web项目和Feature Test项目的解决scheme中,都取消了相同的数据访问(或“Core”)项目。 我和其他许多人一样,使用Visual Studio 2013中的NuGet下载副本。

我所做的是在Visual Studio中为functiontesting和Web项目添加了一个x86和x64解决scheme文件夹。 然后我做了一个Right Click | Add Existing Item... Right Click | Add Existing Item... ,并为每个文件夹从..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]添加相应的SQLite.interop.dll库。 然后我做了一个Right Click | Properties Right Click | Properties ,并将“ Copy to Output Directory设置为Always Copy 。 下一次我需要运行我的functiontesting,testing运行成功。

简而言之

为了使这个工作也与NCrunch一起工作,我必须在NCrunchconfiguration中添加 NuGet包提供的Interop.dll版本作为附加文件 。

我的情况

我有一个C#解决scheme,其中一个项目直接依赖于SQLite(一个辅助库)和一个使用这个辅助库的unit testing项目。 我已经安装了System.Data.SQLite.Core版本1.0.97.0作为NuGet包。

在我的情况下,Marin提供的解决方法是在Visual Studio和CI中工作。 但是,这仍然会在NCrunch中提供错误。

在NCrunchconfiguration中,我在unit testing项目设置下的“包含其他文件”中添加了以下path:

 ..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\**.dll 

我遇到了同样的问题。 但是,最后,我可以修复它。 目前,我使用Visual Studio 2013社区版。 我只是使用Add-> Existing Item …并浏览到SQLite.Data.SQLite文件所在的位置(我的情况是'C:\ Program Files(x86)\ System.Data.SQLite \ 2013 \ bin')。 请不要忘记更改包含在Assembly Files(* .dll; * .pdb)中的内容 。 在该文件夹中select“ SQLite.Interop.dll ”。 从那里,然后,我可以继续没有任何问题。 祝大家好运。 ^ _ ^ PS我创build网页表单应用程序。 我还没有在窗体应用程序或其他人尝试。

尝试将平台目标设置为x86或x64(而不是任何CPU),然后在Visual Studio中构build:Project-> Properties-> Build-> Platform target。

在debug文件夹中为x86和x64复制“SQLite.Interop.dll”文件。 这些文件应该复制到debugging文件夹中的“x86”和“x64文件夹。

我自己也遇到过这个问题,但结果却是另一个原因:

 System.DllNotFoundException was caught Unable to load DLL 'SQLite.Interop.dll': Access is denied. 

在这种情况下,代码(间接)从IIS托pipe的Web服务中调用(为x86构build而configuration)。 我终于把它追踪到了IIS中的应用程序池:原来我使用的是“ASP.NET V4.0 Integrated” (导致了这个错误),但是当我将它改为“DefaultAppPool”时 ,问题就消失了。

(唷!)

我想张贴在这里,因为这个问题的复杂性。 我的解决scheme是回滚到.Net 4.0。 我已经testing了3天,并没有能够得到System.Data.SQLite.Core.1.0.98.0与.Net 4.5或.Net 4.5.1工作。

testing在3台计算机,2个服务器一台dev电脑上是详尽的。 我一直无法find问题的根源。 我已经尝试编辑.vsproj文件。 我实际上已经将SQLite.interop.dll添加到所有文件夹。 我已将该软件包应用于所有GAC文件夹,并单独删除并重新应用。 最终删除。

我有System.Data.SQLite.Core.1.0.98.0与.NET 4.0工作。 我打算继续尝试移植,但是我想我会先开始一个新的项目,看看我能否以这种方式开展工作。 这原本是一个.Net 3.5的networking应用程序,在我的旅行中,我发现了大量的信息仍然参考这个框架。

所以,我的问题是SQLite试图在WPF的devise时加载。 由于我只关心x86环境,因此我将CPU优先级设置为该优先级,并将SQLite.Interop.dll从Nuget包复制到解决scheme的根目录。 重新启动解决scheme,所有问题都消失了。 所以,如果你有devise时问题,把库放到解决scheme的根目录下。

另外,我在运行时遇到了类似的问题,所以我不得不将SQLite.Interop.dll的副本放到我的项目中,并将它设置为在属性中更新的情况下进行复制。 看来,提供的x86和x64文件夹是完全无用的。 进一步的调查是必需的,但总体来说…在你的项目中手动引用SQLite比使用Nuget包简单。

另外,官方的FAQ说明如下:

(20)在Visual Studio中编译并运行System.Data.SQLite项目时,为什么在尝试运行时遇到DllNotFoundException或BadImageFormatException(对于“sqlite3.dll”或“SQLite.Interop.dll”)或debugging应用程序?

在使用System.Data.SQLite项目(包括testing项目)的Visual Studio中编译和运行解决scheme时,select正确的构buildconfiguration和平台非常重要。 首先,在Visual Studio中debugging的托pipe应用程序不能使用混合模式程序集(即因为它总是编译到特定于平台的编译输出目录)。 这是使用相同的源项目文件正确支持多平台的构build二进制文件所必需的。 因此,在依赖于System.Data.SQLite程序集的Visual Studio中运行托pipe应用程序时,应仅select“DebugNativeOnly”或“ReleaseNativeOnly”构buildconfiguration。 这些构buildconfiguration包含一个自定义构build后步骤,可将所需的本机程序集复制到托pipe输出目录(即启用运行托pipe二进制文件)。 但是,如果所选平台与操作系统匹配(例如32位Windows为“Win32”,64位Windows为“x64”),则仅执行此后构build步骤。 因此,在尝试运行解决scheme中的托pipe项目之前,最好仔细检查所选的构build平台与操作系统。

https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20