在非开发PC上找不到System.Data.SQLite

时间:2011-03-01 00:40:57

标签: c# visual-studio-2010 sqlite

我在Visual Studio中创建了一个C#项目,并在http://sqlite.phxsoftware.com/的SQLite 4.0 ADO库中使用了一个程序集。

程序在开发机器上运行正常,但是当我尝试在另一个系统上运行时,总会出现错误,指出无法找到System.Data.SQLite.dll。我把文件放到程序目录中。我还尝试将其放入PATH下列出的目录中。有什么建议吗?

我正在使用openFileDialog打开数据库。这是相应的代码:

con = new SQLiteConnection();


                OpenFileDialog ofd1 = new OpenFileDialog();

                ofd1.Filter = "db Datei (*.db)|*.db|Alle Dateien (*.*)|*.*";

                if (ofd1.ShowDialog() == DialogResult.OK)
                    filepath = ofd1.FileName;
                filepath.Replace("\\", "\\\\");
                con.ConnectionString = "Data Source= \"" + filepath + "\"";
    [...]

如前所述,这适用于开发机器(Windows 7,64bit)。 测试机器在虚拟机(Windows 7,32位)中运行。 发生以下异常:

    System.IO.FileNotFoundException: Die Datei oder Assembly "System.Data.SQLite.dll" oder eine Abhängigkeit davon wurde nicht gefunden. Das angegebene Modul wurde nicht gefunden.
    Dateiname: "System.Data.SQLite.dll"
       bei WindowsFormsApplication1.Form1.button2_Click(Object sender, EventArgs e)
       bei System.Windows.Forms.Control.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
       bei System.Windows.Forms.Button.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Geladene Assemblys **************
mscorlib
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
----------------------------------------
WindowsFormsApplication1
    Assembly-Version: 1.0.0.0.
    Win32-Version: 1.0.0.0.
    CodeBase: file:///C:/Users/andi/Documents/My%20Dropbox/Own%20Public%20Folders/Public%20(Andy%20Malessa)/juralookup(Wir%20brauchen%20dringend%20nen%20Namen)/DataManagementTool/WindowsFormsApplication1.exe.
----------------------------------------
System.Windows.Forms
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 built by: RTMRel.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
----------------------------------------
System.Drawing
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 built by: RTMRel.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
----------------------------------------
System
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 built by: RTMRel.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
----------------------------------------
System.Windows.Forms.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 built by: RTMRel.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
----------------------------------------
mscorlib.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
----------------------------------------

所以基本上它说:“System.Data.SQLite.dll”或找不到依赖。

该文件存在于应用程序目录中。这是一个文件列表: File Listing

6 个答案:

答案 0 :(得分:5)

如果从C#项目引用存储在开发机器上的GAC中的System.Data.SQLite.dll中存储的DLL,并且测试客户端上不存在该DLL,则会收到该消息。在这种情况下,您需要在测试计算机上安装SQLlite(从而将DLL放在GAC中),或者更改项目中的引用以指向本地DLL instaid。

答案 1 :(得分:2)

  1. 尝试引用gac之外的版本
  2. 你提供了正确的版本(即32对64位)?
  3. 我也有这个问题,我认为第一点是修正了它。您部署它的机器显然没有它在gac中,如果你引用该版本,它将无法在其他地方找到。至少那是我的经历。

答案 2 :(得分:2)

您需要向我们提供有关该例外的更多详细信息。同时,尝试将以下内容添加到app.config:

<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite"/>
</DbProviderFactories>
</system.data>

答案 3 :(得分:2)

我有同样的问题。这是我做了和发现的: 我迷上了AppDomain的AssemblyLoad事件并跟踪了所有已加载的程序集。我在System.Data.SQLite.dll中添加了对类的引用,以便在Fluent NHibernate使用它之前强制加载。瞧,SQLite是从GAC加载的。不知道它是如何实现的,因为我刚刚下载了.Net提供商的ZIP文件。

这就是为什么System.Data.SQLite.dll在项目(项目A)中本地复制直接引用它的原因,但是在引用项目A的项目中没有。对于它们,不需要复制,因为文件驻留在GAC中。在我的特定情况下,NHibernate.Driver.SQLite20Driver将尝试加载System.Data.SQLite程序集,但出于任何原因它没有这样做。也许它真的希望程序集放在输出文件夹中,但是我再次看到AssemblyResolve对该DLL的尝试,这应该意味着它使用标准的.Net方法来加载程序集。

在任何情况下,解决方案是在我的数据访问DLL中包含并挂钩此AssemblyResolve处理程序:

Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name == "System.Data.SQLite")
        return typeof (CollationSequence).Assembly;
    else
        return null;
}

希望这有帮助,Christoph

答案 4 :(得分:2)

对于在客户端计算机上安装ADO.NET SQLite Provider的用户不可用: 请下载适用于32位的Microsoft Visual C++ 2010 Redistributable Package (x86)和适用于64位Windows的Microsoft Visual C++ 2010 Redistributable Package (x64),并将其安装在客户端计算机上。这解决了我的问题。

答案 5 :(得分:2)

您可以使用DEPENDS.EXE查找被DLLs库注意的System.Data.SQLite.dll

在我的情况下,System.Data.SQLite.dll不想在没有msvcr100.dll的情况下加载(C运行时库用于本机代码)。将其添加到应用程序目录可以解决问题。

注意:C运行时库与平台有关!