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


205

定期出现以下异常:

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

我正在使用1.0.82.0。版本,将其与nuget一起安装在VS2010,OS Win7 64中。

一旦异常开始出现,它就会不断出现-在VS内外的调试,发布和运行应用程序中。

停止它的唯一方法是注销和登录。不会引发异常,并且会加载dll。它可以工作数天,但随后又可能损坏。

有没有人看到这样的东西,有解决方案吗?


2
是的,它设置为始终复制。我在bin / debug中有x64和x86文件夹。它大部分都可以工作,但有时只是停止工作。可能是某些东西阻止了对dll的访问,下次尝试停止工作时,我将尝试将其找出来。就像我说的那样,它可以正常工作几天而不会出现任何问题。
xll 2012年

13
将SQLite nuget包添加到新的控制台项目后,我立即获得了该错误。从x86文件夹中手动复制SQLite.Interop.dll到一个级别允许该应用程序运行。对我来说似乎很奇怪,这将被打破。
lesscode 2012年

@Wayne是的,这绝对有帮助。但就我而言,我们正在共同努力进行该项目,我的朋友正在使用x86,而我使用的是x64 OS。而且我注意到,有时它只是停止工作。虽然上个月我没有发生过。
xll 2012年

1
如果为SQLite下载正确的二进制文件,则根据项目构建选项将SQLite.Interop.dll复制到Release或Debug文件夹中。
Elshan 2014年

这是一个随机的错误...有时会发生,有时不发生在我的项目中。尝试了一切。
2014年

Answers:


140

我知道我参加晚会很晚,但是在我取消了最新的x86 / x64(版本1.0.88.0)之后,我遇到了这个问题。我的VS2012中的本地IIS默认运行32位,并且没有简单的方法可以切换到x64。我的生产服务器运行64位。

无论如何,我将NuGet软件包安装到DLL项目中,但出现此错误。为了使其正常工作,我还必须将其安装到主站点项目中。即使它根本不涉及SQLite类。

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


11
在将带有NuGet的SQLite Core引用添加到主项目之后,它为我工作。
卡·克雷莫内西

添加sqllite.core为我工作在我的WPF解决方案的主要项目
迪普拉吉

即使数据库调用位于库中,我也必须将Sqlite以及Install-Package System.Data.SQLite.Core都安装到我的网站中……

这应该是答案。
Bobby Turkalino '17

4
您所说的“主站点”项目是什么意思?就我而言,我正在做桌面工作。您的意思是“启动”项目吗?
UuDdLrLrSs '18

60

我有这个问题,因为我正在使用的dll具有Sqlite作为依赖项(在NuGet中仅使用Sqlite核心程序包进行配置。)。该项目将编译并复制除“ SQLite.Interop.dll”(x86和x64文件夹)之外的所有Sqlite dll-s。

解决方案非常简单:只需将Sqlite.Core程序包作为依赖项(与NuGet一起)添加到正在构建/运行的项目中,即可复制dll-s。


为我工作!谢谢
Tristan Djahel 2015年

同意 我正在使用“ Sqlite.Net PCL”包,但发现我还需要“ System.Data.SQLite Core(x86 / x64)”。我还必须更改引用它的项目,以使用“ x86”或“ x64”的平台目标,而不是“任何CPU”。
Andrew Stephens 2015年

2
尝试了许多此处发布的解决方案,但实际上效果最好。
2015年

2
您如何添加这样的依赖关系?没做过(VS2013)
jpgrassi

3
转到工具-> NuGet软件包管理器->管理解决方案的NuGet软件包...->在线->全部。然后搜索sqlite并添加System.Data.SQLite Core(x86 / x64)。
马林

44

在平台目标为的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>

我正在使用VS 2010,没有此类选项。
xll

@xll,我编辑了答案以进行澄清。检查编辑是否清除所有内容。
Caleb Kiage 2013年

10
在VS2012中,此选项对我来说是灰色的。
Kugel 2013年

6
该选项仅在EXE项目中启用,但我认为我们大多数人在单元测试项目中都遇到此问题。
布兰农2014年

1
在VS Pro 2015中的WPF项目中对我来说是灰色的。 .csproj文件已将其设置为false已设置,但仍然存在错误。
vapcguy

32

这就是我在项目中修复它的方式。

它正在工作,当一位同事提交他的更改时,我收到了“无法加载DLL'SQLite.Interop.dll'”异常。

与项目的.csproj文件不同,该文件为NON-WORKING版本:

<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>

还原后,我没有收到异常。DLL文件已转储到相应的Debug \ x64(etc)文件夹中。


项目的.csproj文件中没有“ SQLite.Interop.dll”的<itemgroup>。我仍然尝试添加您的解决方案,但没有成功:(
ayc

这在VS2012中将不起作用,该元素不存在。
htm11h 2015年

非常感谢你。在2015年主场迎战
Jevgenij Kononov

29

因此,在添加NuGet之后,部署不会复制Interop。您可以将此添加到您的csproj文件中,它应该可以解决该问题:

 <PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
 </PropertyGroup>

如果查看NuGet for SQLite的源代码,则可以看到它们的具体作用。这使我可以使用ASP.Net Core进行部署。


10
答案是ContentSQLiteInteropFiles。大多数最重要的答案都是猜测。
Corey Alix

6
是的,ContentSQLiteInteropFiles就是答案。1.这应该是公认的答案。2.另一方面,应该调查一下,作为一个nuget包如何自动进行此工作,或者至少记录该配置的需要。
gerleim

应该是公认的答案。超级简单。1.卸载项目2.将以上内容添加到csproj 3.重新加载项目。就是这么简单...
BillRuhl

24

当您处于此状态时,请尝试执行全部重建。如果这样可以解决问题,则您可能遇到了与我相同的问题。

一些背景(我的理解)

  • 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)。当我执行完整的全部重建时,VS会正确复制文件夹及其内容。

我的解决方案

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

或者,您可以使用构建配置/输出目录来做一些更奇特的事情。


1
我收到的消息是告诉我那些文件丢失了,但我认为这是一个权限问题。看到您的消息后,我意识到他们在部署时实际上从未将其发送到服务器。
Stradas 2015年

1
我几乎相同的解决方案是将x86和x64文件夹添加到我的启动项目中,然后在各自的文件夹中添加x86 interop和x64 interop文件。我将文件的选项设置为“内容”和“始终构建”。当我将带有ClickOnce的应用程序部署到其他PC上时,这是使Windows Forms应用程序连接到嵌入式s3db数据库文件的唯一方法。令人沮丧的是,在PC上开发和测试该应用程序时,没有出现SQLite错误。
大卫·艾伦·康迪特

VS 2017仍在发生:'(
wmebane

1
尽管我的解决方法有所不同,但这是可以帮助我理解问题的答案。我的问题是我手动添加了system.data.Sqlite.dll。这样,Sqlite.Interop.dll不会自动复制到\ x86和x64。解决方法是删除引用,然后通过Nuget添加它。
苏珊·王

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
    }
}

这会导致将所需的内容SQLite.Interop.dll复制到x86相应的“ TestResults”文件夹中的目录中。

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


1
仅当您使用Microsoft.VisualStudio.TestTools.UnitTesting命名空间时,此解决方案才有效
sapbucket 2014年

4
如果您使用的是MSTest,这是一个正确的解决方案。在我使用DeploymentItem(“ some.csv”)进行测试之前,SQLite正常运行,找到SQLite.Interop.dll没有问题。以这种方式包含.csv文件会触发MSTest将所有引用的dll复制到TestResults目录中。由于在项目中未引用SQLite.Interop.dll(并且由于未托管代码而无法引用),因此永远不会复制过来。
约翰

最好的选择是添加两行,每种体系结构一行。如果测试运行程序恰好在运行64位,则可以为您提供保护。
柯克·沃尔

13

Tools -> Extension and updates该命令更新NuGet 并使用命令重新安装SQLite.Core,PM> Update-Package -reinstall System.Data.SQLite.Core为我修复了该问题。


如果您在执行此操作时遇到错误,请删除我的SQLite DLL /引用并从nuget中完全重新安装它们,这对我来说就是成功的秘诀
KayakinKoder,2016年

重新安装sqllite核心对我也有帮助。发生在VS2012。VS没有将x62版本包含在Web部署程序包中
Andrey R

在VS2015 Professional中也为我修复。
拉胡尔·基肖尔

9

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

就在Visual Studio中进行调试而言,一切正常,但部署的版本缺少包含该DLL的文件夹x86 /和x64 /。

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

这样,ClickOnce发布工具会自动在清单中包含这些文件和文件夹,并与它们一起部署软件


1
这是唯一对我有用的解决方案。。。男孩。当您的应用仅在用户计算机上关闭时,调试起来很麻烦。
stoic 2015年

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文件旁边。


6

NuGet的SQLite多体系结构(x86,x64)版本的默认安装显示了您描述的行为。如果您希望为.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));

4

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

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

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

HTH,福门茨


非常感谢,我尝试了其他所有方法,这就是解决方案
David Benko 2015年

4

SQLite Wiki所述,您的应用程序部署必须是:

应用部署

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

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


3

如果尝试在64位项目中运行32位dll,也可能会出现此错误。

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



3

我不知道为什么尚未将其包括在内,但我必须进行研究并亲自找到要解决的问题,因此希望有人能够找到此答案并省去麻烦。这是用于WPF应用程序的。它在我的开发箱上运行良好,但在我将其复制并出现Unable to load DLL 'SQLite.Interop.dll'错误的计算机上却无法运行。当我运行它时遇到与OP相同的错误时,我将其所有关联的目录和文件直接从我的“ Debug”文件夹移植到了另一台计算机上。当我使用此路径复制到另一台计算机时,包含我的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,并且只能在Windows 7+(64位OS)上运行。(没有仅x86 / 32位DLL)
  • 遇到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 ++可再发行组件:https :
//www.microsoft.com/zh-cn/download/details.aspx?id=48145

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


3

我已经开始使用Costura.Fody打包(.net)程序集,并嵌入和预加载本机dll。这也对以后的分发有所帮助,因为您可以发送一个文件。

  1. 从Nuget安装Costura Fody。

  2. 在您的C#项目中,创建一个名为costrua32的文件夹。在其中添加要加载C#的所有本机dll。

  3. 将它们添加到此文件夹后。单击属性窗口,然后将构建操作更改为“嵌入式资源”

  4. 最后,您需要如下修改名为FodyWeavers.xml的XML文件。在这里,我指定首先加载sql dll。(请注意您删除了.dll)

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

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



3

还将dll添加到测试项目中(通过Nuget Manager)并对其进行了修复。


2

我遇到此问题是因为PC中未安装Visual C ++ 2010可再发行组件。如果尚未安装Visual c ++ 2010可再发行组件,请下载并安装(检查x86或64 dll)。


是。这也是我的情况...只有我的用户需要Visual C ++ 2010可再发行的SP1。最佳解决方案是仔细阅读您的版本所需的运行时。例如此处:system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Velja Radenkovic


2

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


2

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


2

将SQLite.Interop.dll复制到项目目录中。

src\
  project\
      bin\   <-- Past in bin
         x64\
           SQLite.Interop.dll <-- Copy this if 64
         x86\
           SQLite.Interop.dll <-- Copy this if 32

我必须授予IIS_APPPOOL对Bin文件的编辑权限才能解决该问题。只是复制DDL导致对DLL的访问被拒绝
AlexanderD

添加这些文件已解决了问题,但这是一个临时解决方案。
Kartik Goyal '18

2

我已经为此苦苦挣扎了很长一段时间,偶尔,我发现测试设置不正确。看到这张图片: 测试设定

我只是取消选中测试设置,问题就消失了。否则,将发生异常。希望这会对某人有所帮助。不确定这是根本原因。


1
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。- 评论
罗伯特·哥伦比亚,

就我而言,testsettings文件是错误的:<TestSettings ... <Deployment> <DeploymentItem filename =“ bin \ Relase \ a.test.dll”。文件位置配置错误。
东尼·孙

2

将x86和x64的“ SQLite.Interop.dll”文件复制到调试文件夹中。这些文件应复制到调试文件夹中的“ x86”和“ x64”文件夹中。


2

我的应用程序是一个Web应用程序(ASP.NET MVC),我不得不改变下的应用程序池运行LocalSystem,而不是ApplicationPoolIdentity。去做这个:

  1. 打开IIS管理器
  2. 查找您的站点正在其下运行的应用程序池。
  3. 从操作中单击“高级设置”
  4. 将身份更改为 LocalSystem

我不知道为什么这可以解决问题。


1

我不知道这是否是一个很好的答案,但是我可以通过在标识为“ Local System”的AppDomain下运行我的应用程序来解决此问题。


1

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



1

供有任何疑问的人参考:

如果您使用nuget软件包,它将安装一个构建规则来为您执行复制。(请参阅System.Data.SQLite.Core.1.0.94.0 \ build-或安装的任何版本的Core)。

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

尽管这仍然不能解决测试用例问题。DeploymentItem(https://stackoverflow.com/a/24411049/89584)方法似乎是唯一可行的方法。


1

在一个带有WebAPI / MVC5 Web项目和Feature Test项目的解决方案中,我遇到了这个问题,它们都来自同一个数据访问(或“ Core”)项目。我和这里的许多人一样,使用的是通过Visual Studio 2013中的NuGet下载的副本。

我所做的就是在Visual Studio中向功能测试和Web项目添加了x86和x64解决方案文件夹。然后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,并设置Copy to Output DirectoryAlways Copy。下次我需要运行功能测试时,测试成功运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.