Visual Studio C# - SQLite.Interop.dll not found Visual Studio C# - SQLite.Interop.dll not found sqlite sqlite

Visual Studio C# - SQLite.Interop.dll not found


I also encountered the similar issue in my environment of Visual Studio 2017 and NET Framework 4.5, the circumstance is:

I am developing an Outlook Add Ins using ClickOnce to publish it and SQLite as the database. After having installed the SQLite library into the project from NuGet, it works perfectly in the local environment but pops up the exception error message "Unable to load DLL 'SQLite.Interop.dll'" on the client machine.

I compared the two environments and found the DLL file 'SQLite.Interop.dll' had not been published to the client machine that we can see in the following graphic.enter image description here

I searched 'SQLite.Interop.dll' in local environment and found it is saved in the following folder "{project}\packages\System.Data.SQLite.Core.1.0.105.2\build\" for the specific .Net FrameWorkenter image description here

So, my solution is adding these two DLL libraries into the project, then they can be published to the client machine using the ClickOnce.enter image description here

(Notice: The selected DLL version should be as same as the NET Framework version in your environment.)


See Using Native Library Pre-Loading at https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

You likely need to include the x86 and x64 folders under the the other SQLite DLL.

Edit: I've added the relevant info below in case the above link ever dies/changes.

If the development and customer machines may have different processor architectures, more than one binary package may be required. For this situation, using the native library pre-loading feature is highly recommended. It is available as of version 1.0.80.0 and enabled by default. In order to take advantage of this feature, the separate managed and interop assemblies must be used with XCOPY deployment (i.e. this feature is not supported by the mixed-mode assembly, nor when the assembly is deployed to the global assembly cache), resulting in an application deployment that looks something like this:

  • bin\App.exe (optional, managed-only application executableassembly)
  • bin\App.dll (optional, managed-only application libraryassembly)
  • bin\System.Data.SQLite.dll (required, managed-only coreassembly)
  • bin\System.Data.SQLite.Linq.dll (optional, managed-onlyLINQ assembly)
  • bin\System.Data.SQLite.EF6.dll (optional,managed-only EF6 assembly)
  • bin\x86\SQLite.Interop.dll (required,x86 native interop assembly)
  • bin\x64\SQLite.Interop.dll (required,x64 native interop assembly)

The string "bin" above represents the directory where the application binaries are to be deployed on the target machine. With the native library pre-loading feature enabled and the application deployment shown above, the System.Data.SQLite managed-only assembly will attempt to automatically detect the processor architecture of the current process and pre-load the appropriate native library.


Please use the answer to the duplicate issue: https://stackoverflow.com/a/60176344/3634867

Don't store the dll yourself and copy it to /bin manually, it will lost control to the version updating and dependency.

TL;DR;

for old csproj file:

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

for new csporj file: (i.e. projects beginning with <Project Sdk="Microsoft.NET.Sdk.*">)

<PackageReference Include="System.Data.SQLite.Core" Version="1.0.110" PrivateAssets="none"/>