无法加载DLL'SQLite.Interop.dll'

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版本.

  • 在我将带有NuGet的SQLite Core的引用添加到主项目之后,它对我有用. (11认同)
  • "主要网站"项目是什么意思?就我而言,我正在做桌面工作.你的意思是"启动"项目? (4认同)

Mar*_*rin 56

我遇到了这个问题,因为我使用的dll有一个Sqlite作为依赖项(在NuGet中配置只有Sqlite核心包.).该项目编译并复制除"SQLite.Interop.dll"(x86和x64文件夹)之外的所有Sqlite dll-s.

解决方案非常简单:只需将Sqlite.Core包作为依赖项(使用NuGet)添加到正在构建/运行的项目中,然后复制dll-s.

  • 另外,我认为 SQLite Core 已安装。但还是失败了:( (4认同)
  • 我们的波长相同; 懒人的解决方案.:) (3认同)
  • 转到工具 - > NuGet包管理器 - >管理解决方案的NuGet包... - >在线 - >全部.然后搜索sqlite并添加System.Data.SQLite Core(x86/x64). (3认同)
  • 尝试过这里发布的许多解决方案,实际上这是最好的。 (2认同)
  • 你怎么能添加这样的依赖?从未做过(VS2013) (2认同)

Cal*_*age 42

在平台目标为的WPF项目中使用SQLite时遇到了同样的问题Any CPU.我按照以下步骤修复了它:

  1. 在Visual Studio中打开项目设计器.有关如何操作的详细信息,请访问此处.
  2. 单击"构建"选项卡.
  3. 禁用该prefer 32-bit选项.

或者,您可以将平台目标设置为x86x64.我认为这个问题是由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)

  • 在VS2012中,此选项对我来说是灰色的. (10认同)
  • 该选项仅在EXE项目上启用,但我认为我们大多数人都有单元测试项目的问题. (6认同)

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)文件夹中.

  • 我尝试使用基于构建类型的 &lt;copy&gt; 但它不适用于单元测试。OutDir 不正确。通过复制“x86”和“x64”文件夹,我猜sqlite(或者可能是.net)找到了它需要的东西。太感谢了! (2认同)

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"文件夹中的目录.

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

  • 如果您正在使用MSTest,这是一个正确的解决方案.SQLite工作正常,找到SQLite.Interop.dll没有问题,直到我使用DeploymentItem("some.csv")进行测试.以这种方式包含.csv文件会触发MSTest将所有引用的dll复制到TestResults目录.由于项目中未引用SQLite.Interop.dll(并且因为它是非托管代码,因此不能引用它),因此它永远不会被复制. (4认同)

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进行部署.

  • 答案是ContentSQLiteInteropFiles。大多数最重要的答案都是猜测。 (4认同)
  • 是的,ContentSQLiteInteropFiles就是答案。1.这应该是公认的答案。2.另一方面,应该调查一下,作为一个nuget包如何自动进行此工作,或者至少记录了对此配置的需求。 (2认同)
  • 请注意,此解决方案仅适用于“旧”风格的项目。对于也适用于“新”风格项目的答案,请参阅/sf/answers/4212344111/ (2认同)

use*_*410 9

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

至于Visual Studio中的调试一切正常,但部署的版本缺少包含该DLL的文件夹x86 /和x64 /.

使用ClickOnce部署之后使其工作的解决方案是在解决方案的启动项目(也是正在发布的项目)中创建这两个子文件夹,将DLL复制到它们中并将它们设置为始终内容复制.

这样,ClickOnce发布工具会自动在清单中包含这些文件和文件夹,并随之部署软件


Sma*_*tis 8

这里有很多答案,但我的简单明了,没有GAC播放.

问题是,可执行文件需要权限SQLite.Interop.dll(x86或x64)的副本才能访问我们的数据库.

大多数架构都有层,在我的例子中,数据层具有SQLite连接所需的DLL.

所以我简单地将一个后期构建脚本放入我的数据层解决方案中,一切正常.


TL; DR;

  1. 将解决方案的所有项目设置为x86x64在构建选项中.
  2. 使用以下内容Post-Build-Script向项目添加以下内容SQLite nuget Package:

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

当然,您必须更改脚本Release Buildx86构建.


STL; DR;

把你的SQLite.Interop.dll下一个*.exe文件.


Ben*_*mps 8

旧项目文件格式

即项目以 <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)

新的 SDK 项目文件格式

即项目以 <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)


For*_*ntz 5

即使是旧帖子,我也想分享我在这里找到的解决方案:http : //system.data.sqlite.org/index.html/info/54e52d4c6f

如果您不想阅读所有问题,解决方案是将文件“msvcr100.dll”(可以在 Windows\System32 目录中找到)复制到与 SQLite.Interop.dll 相同的路径中。

我建议阅读该问题以了解原因,并将该文件包含在您的设置中,但仅在发生错误时才安装它,我将其设为可在设置选项中选择的可选组件。

HTH, 福门茨


vap*_*guy 5

我不知道为什么这还没有被包括在内,但我必须做研究并为自己找到这个,所以希望有人能找到这个答案并省去麻烦。这是一个 WPF 应用程序。它在我的 Dev box 上运行良好,但在我复制它的计算机上却无法运行并出现Unable to load DLL 'SQLite.Interop.dll'错误。当我运行它时遇到与 OP 相同的错误时,我将其所有关联的目录和文件直接从我的“调试”文件夹移植到另一台计算机。包含我的 DLL 的“bin”文件夹已被复制到“Debug\bin”,并且当我使用此路径复制到另一台计算机时,所有文件以及我的应用程序文件都被包含在内,因此它没有丢失任何文件。

我在其他答案中看到的内容不适用:

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

我发现的是这个,来自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


Kel*_*ett 5

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

应用部署

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

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


小智 5

我遇到过同样的问题。请按照以下步骤操作:

  1. 确保您已System.Data.SQLite.Core通过SQLite Development Teamfrom安装软件包 NuGet
  2. 转到项目解决方案并尝试buildpackages文件夹中找到文件夹
  3. 检查您的项目框架并选择所需的 SQLite.Interop.dll 并将其放在您的调试/发布文件夹中

参考