xll*_*xll 182 c# sqlite visual-studio-2010
我定期得到以下异常:
Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
我使用的是1.0.82.0.版本,在VS2010,OS Win7 64中使用nuget进行安装.
一旦异常开始出现,它就会不断出现 - 在VS内部或外部的调试和发布以及运行应用程序.
停止它的唯一方法是注销和登录.不抛出异常并加载dll.它可以工作几天,但它可以再次破坏.
有没有人见过这样的东西,有没有解决方案呢?
Kug*_*gel 126
我知道我迟到了,但是在我今天推出最新的x86/x64(版本1.0.88.0)之后我就遇到了这个问题.我在VS2012中的本地IIS默认运行32位,没有简单的方法可以切换到x64.我的生产服务器运行64位.
无论如何,我将NuGet包安装到DLL项目,我得到了这个错误.为了让它工作,我必须做些什么我必须将它安装到主站点项目中.即使它根本不触及SQLite类.
我的猜测是SQLite使用入口程序集来检测要加载的Interop版本.
Mar*_*rin 56
我遇到了这个问题,因为我使用的dll有一个Sqlite作为依赖项(在NuGet中配置只有Sqlite核心包.).该项目编译并复制除"SQLite.Interop.dll"(x86和x64文件夹)之外的所有Sqlite dll-s.
解决方案非常简单:只需将Sqlite.Core包作为依赖项(使用NuGet)添加到正在构建/运行的项目中,然后复制dll-s.
Cal*_*age 42
在平台目标为的WPF项目中使用SQLite时遇到了同样的问题Any CPU
.我按照以下步骤修复了它:
prefer 32-bit
选项.或者,您可以将平台目标设置为x86
或x64
.我认为这个问题是由System.Data.SQLite
使用平台目标的库获取'SQLite.Interop.dll'文件的位置引起的.
更新:
如果无法访问项目设计器,只需*.csproj
从文本编辑器中打开project()文件并将值添加<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>
Run Code Online (Sandbox Code Playgroud)
Wil*_*Wil 32
这就是我在项目中修复它的方法.
它工作正常,当一位同事提交他的更改时,我收到了"无法加载DLL'SQLite.Interop.dll'"的例外情况.
区分项目的.csproj文件,这是在非工作版本中:
<ItemGroup>
<Content Include="x64\SQLite.Interop.dll" />
<Content Include="x86\SQLite.Interop.dll" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
这就是WORKING版本的含义:
<ItemGroup>
<Content Include="x64\SQLite.Interop.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="x86\SQLite.Interop.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
回复后,我没有收到例外.DLL文件被转储到适当的Debug\x64(etc)文件夹中.
sfm*_*sfm 24
当你进入这种状态时,尝试执行Rebuild-All.如果这可以解决问题,您可能会遇到同样的问题.
一些背景(我的理解):
SQLite有1个托管程序集(System.Data.SQLite.dll)和几个特定于平台的程序集(SQLite.Interop.dll).使用Nuget安装SQLite时,Nuget会将特定于平台的程序集添加到您的项目中(在几个文件夹中:\ x86,\ x64),并将这些dll配置为"始终复制".
加载后,托管程序集将在\ x86和\ x64文件夹中搜索特定于平台的程序集.你可以在这里看到更多.例外是这个托管程序集试图在这些文件夹中找到相关的(SQLite.Interop.dll)(并且失败).
我的场景:
我的解决方案中有2个项目; WPF应用程序和类库.WPF应用程序引用类库,类库引用SQLite(通过Nuget安装).
对我来说问题是当我只修改WPF应用程序时,VS尝试进行部分重建(意识到依赖的dll没有改变).在此过程的某个地方,VS会清除\ x86和\ x64文件夹的内容(吹掉SQLite.Interop.dll).当我执行完整的Rebuild-All时,VS会正确复制文件夹及其内容.
我的解决方案:
为了解决这个问题,我最后使用xcopy添加了一个Post-Build进程,强制将\ x86和\ x64文件夹从类库复制到我的WPF project\bin目录.
或者,您可以使用构建配置/输出目录进行更好的操作.
Mic*_*ley 19
我在运行Visual Studio Express 2013时遇到了同样的问题.我尝试过这里和其他地方提到的几个解决方案无济于事.我希望这个修复可以帮助别人.
我通过使用测试基于SQLite的服务的测试类上的DeploymentItem
属性来修复它.
例:
[TestClass]
[DeploymentItem(@"x86\SQLite.Interop.dll", "x86")] // this is the key
public class LocalStoreServiceTests
{
[TestMethod]
public void SomeTestThatWasFailing_DueToThisVeryIssue()
{
// ... test code here
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致需要SQLite.Interop.dll
复制到x86
相应"TestResults"文件夹中的目录.
一切都是绿色的.一切都很好.
Fil*_*ani 12
Tools -> Extension and updates
使用命令PM> Update-Package -reinstall System.Data.SQLite.Core
为我修复NuGet 并重新安装SQLite.Core .
b.p*_*ell 12
因此,在添加NuGet之后,部署不会复制Interops.您可以将其添加到您的csproj文件中,它应该修复该行为:
<PropertyGroup>
<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
<CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
<CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
<CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
如果您查看Nuite的SQLite源代码,您可以看到它们具体做了什么.这使我能够使用ASP.Net Core进行部署.
我在多项目解决方案中遇到了类似的问题.SQLite.Interop.dll是使用ClickOnce随软件分发的其中一个插件所必需的.
至于Visual Studio中的调试一切正常,但部署的版本缺少包含该DLL的文件夹x86 /和x64 /.
使用ClickOnce部署之后使其工作的解决方案是在解决方案的启动项目(也是正在发布的项目)中创建这两个子文件夹,将DLL复制到它们中并将它们设置为始终内容复制.
这样,ClickOnce发布工具会自动在清单中包含这些文件和文件夹,并随之部署软件
这里有很多答案,但我的简单明了,没有GAC播放.
问题是,可执行文件需要权限SQLite.Interop.dll
(x86或x64)的副本才能访问我们的数据库.
大多数架构都有层,在我的例子中,数据层具有SQLite连接所需的DLL.
所以我简单地将一个后期构建脚本放入我的数据层解决方案中,一切正常.
x86
或x64
在构建选项中.使用以下内容Post-Build-Script
向项目添加以下内容SQLite nuget Package
:
xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
当然,您必须更改脚本Release Build
和x86
构建.
把你的SQLite.Interop.dll
下一个*.exe
文件.
即项目以 <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
将以下内容添加到“main”/root 项目上的 csproj
<PropertyGroup>
<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
<CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
<CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
<CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
即项目以 <Project Sdk="Microsoft.NET.Sdk.*">
PrivateAssets="none"
将依赖链中的每个 ProjectReference/PackageImport添加到 System.Data.Sqlite PackageImport
前任:
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.110" PrivateAssets="none"/>
Run Code Online (Sandbox Code Playgroud)
小智 6
来自NuGet的SQLite的多架构(x86,x64)版本的默认安装展示了您描述的行为.如果您想为.NET运行时选择在您的计算机上运行应用程序的实际体系结构加载正确的版本,那么您可以为DLL加载程序提供有关在何处找到正确库的提示,如下所示:
在Program.Main()之前为set32LDirectory()添加一个kernel32.dll函数调用声明:
[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);
Run Code Online (Sandbox Code Playgroud)
然后使用您自己的方法确定正确的子目录,以查找"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));
Run Code Online (Sandbox Code Playgroud)
即使是旧帖子,我也想分享我在这里找到的解决方案:http : //system.data.sqlite.org/index.html/info/54e52d4c6f
如果您不想阅读所有问题,解决方案是将文件“msvcr100.dll”(可以在 Windows\System32 目录中找到)复制到与 SQLite.Interop.dll 相同的路径中。
我建议阅读该问题以了解原因,并将该文件包含在您的设置中,但仅在发生错误时才安装它,我将其设为可在设置选项中选择的可选组件。
HTH, 福门茨
我不知道为什么这还没有被包括在内,但我必须做研究并为自己找到这个,所以希望有人能找到这个答案并省去麻烦。这是一个 WPF 应用程序。它在我的 Dev box 上运行良好,但在我复制它的计算机上却无法运行并出现Unable to load DLL 'SQLite.Interop.dll'
错误。当我运行它时遇到与 OP 相同的错误时,我将其所有关联的目录和文件直接从我的“调试”文件夹移植到另一台计算机。包含我的 DLL 的“bin”文件夹已被复制到“Debug\bin”,并且当我使用此路径复制到另一台计算机时,所有文件以及我的应用程序文件都被包含在内,因此它没有丢失任何文件。
我在其他答案中看到的内容不适用:
我发现的是这个,来自https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20:
(11) 为什么我在尝试运行我的应用程序时会得到一个 DllNotFoundException(对于“sqlite3.dll”或“SQLite.Interop.dll”)?
无法找到指定的动态链接库 (DLL),或者由于缺少依赖项而无法加载。确保命名的动态链接库位于应用程序目录或系统 PATH 中的目录中,然后重试。此外,请确保已安装必要的 Visual C++ 运行时可再发行组件,除非您使用的是静态链接到它的动态链接库。
强调我在段落内的粗体部分。目标计算机是全新的,除 .NET 4.0 外没有加载任何程序。一旦我安装了 C++,它就能够完成 SQLite 的命令。这应该是第一个常见问题解答之一,也是先决条件的一部分,但它被埋在了#11。我的开发计算机已经加载了它,因为它带有 Visual Studio,这就是它在那里工作的原因。
下载:
适用于 Visual Studio 2015 的 Visual C++ Redistributable: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所说,您的应用程序部署必须是:
所以你需要遵守规则。找到与您的目标平台匹配的dll并将其放置在位置,如图所示。DLL 可以在 YourSolution/packages/System.Data.SQLite.Core.%version%/ 中找到。
我在应用程序部署方面遇到了问题,所以我只是将正确的 SQLite.Interop.dll 添加到我的项目中,将 x86 文件夹添加到安装项目中的 AppplicationFolder 并添加了对 dll 的文件引用。