I never could get the NuGet package to cooperate with the interop dlls, so 
here's what I've done. I create a Solution-level Library folder (and matching 
physical folder) with this layout:

<solution>
    \Library
        System.Data.SQLite.dll
        \x64
            SQLite.Interop.dll
        \x86
            SQLite.Interop.dll
        <project 1>
        ...
        <project n>

I then reference System.Data.SQLite.dll in each project as needed, directly 
from Library. In any project that references it, I add project-level x64 and 
x86 folders. I then add the each interop file, but as a *Link* to the physical 
file under Library. I set those interop files' Build Action to Content, and 
Copy if newer. That copies the interop files, under their x64 and x86 
directories, to the correct project output directories.

The initial setup is a minor pain, but after that, it just works.

To get the necessary files any time there is an upgrade, I create a temp 
project and install the NuGet System.Data.SQLite.Core package, then just copy 
the appropriate 3 files to that structure above. 

-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of Barry Smith
Sent: Thursday, February 23, 2017 12:53 PM
To: SQLite mailing list <sqlite-users@mailinglists.sqlite.org>
Subject: Re: [sqlite] SQLite.Interop.dll

Oh, I do remember having this issue before.

I think the cause is this: Visual studio attempts to trace which dlls are 
required for each project. Then if project A is dependent on project B, visual 
studio will copy what it thinks is all the required dlls for both projects into 
project A's output directory.

Unfortunately visual studio is only so smart and doesn't realise that the 
SQLite.interop.dll is a required dependency. I believe the NuGet package puts 
instructions to move those dlls to the output directory by means of xcopy. So, 
you have this situation:

Project GlobalSQLite, with reference to SQLite.
Project GeneologyControls, with reference to GlobalSQLite.

Tell visual studio to build and it goes and executes the step where the SQLite 
interop DLL is copied to the output of the GlobalSQLite project. But then it 
builds GeneologyControls and doesn't realise it needs to copy the interop DLLs! 
So finally your program executes in the output directory of the 
GeneologyControls project, but the SQLite.interop.dll files are in the output 
of the other project.

You need to ensure that the SQLite interop dlls are in the final output 
directory (and also included when you distribute your application). You can do 
this manually using windows explorer, or you can put in a pre or post build 
event of your final project to copy the x64 and x86 folders (containing the 
SQLite.interop.dll files) into its output directory. Doing it from Windows 
explorer is easier, but you may forget then if you do a clean build a few years 
down the line you'll run into the problem again.

Perhaps there's a cleaner way to do this. Those were my solutions, though...

> On 23 Feb 2017, at 1:58 PM, Clyde Eisenbeis <cte...@gmail.com> wrote:
> 
> -------------------
> About two years ago, I downloaded and installed SQLite.  I don't 
> recall the details, but it was a program that installed SQLite.
> 
> I ended up with files such as EntityFramework.dll, 
> EntityFramework.SqlServer.dll, System.Data.SQLite.dll, etc.  This 
> required "using System.Data.SQLite".
> 
> -------------------
> I then created a WPF C# genealogy program ... and a GlobalSQLite.dll 
> library (as a WPF Custom Control Library).
> 
> The GlobalSQLite.dll library contains commonly used functions.  For example:
> 
>   boCreateFileAndTables(string stPathFilename,
>                         List<string> liststTableNames,
>                         List<string> liststFieldDefinitions)
>   {...}
> 
> -------------------
> I am working to improve / clean up the original code for WPF C# 
> genealogy program.
> 
> When I have SQLite installed on my genealogy program and on my 
> GlobalSQLite.dll library, it works fine.
> 
> When I don't have SQLite installed on my genealogy program, I get an 
> exception "Unable to load DLL 'SQLite.Interop.dll'".  It occurs in my 
> GlobalSQLite.dll library program:
> 
>    sqliteConn = new System.Data.SQLite.SQLiteConnection("Data
> Source=" + stPathFilename + ";").
> 
> I do find SQLite.Interop.dll under ...
> GlobalsSQLite\packages\System.Data.SQLite.Core.1.0.101.0\build\net46\x
> 86
> ... and under ... \x64.
> 
> Is there a better place to put SQLite.Interop.dll so it works?
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to