无法加载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时,我遇到了同样的问题。 我通过以下步骤来修复它:
- 在Visual Studio中打开项目devise器。 关于如何做的细节可以在这里find。
- 点击Build选项卡。
- 禁用
prefer 32-bit
选项。
或者,您可以将平台目标设置为x86
或x64
。 我认为这个问题是由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;
- 在构build选项中将解决scheme的所有项目设置为
x86
或x64
。 -
使用
SQLite nuget Package
将以下Post-Build-Script
添加到项目中:xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
当然,你必须改变Release Build
和x86
版本的脚本。
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。 这也有助于以后的发行,因为你可以发送一个文件。
-
从Nuget安装Costura Fody。
-
在C#项目中创build一个名为costrua32的文件夹。 在那里添加任何C#的本地dll加载。
-
一旦你将它们添加到这个文件夹。 点击属性窗口,将构build操作更改为“embedded式资源”
-
最后,您需要修改名为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