2011-03-01 73 views
4

我在Visual Studio中创建了一个C#项目,并使用来自http://sqlite.phxsoftware.com/的SQLite 4.0 ADO库上的程序集。System.Data.SQLite在非开发PC上找不到

该程序在开发机器上运行良好,但是当我尝试在另一个系统上运行它时,总会出现一个错误,指出找不到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,64位)。 测试机器在虚拟机中运行(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

+0

你能发布确切的错误信息吗?这可能会帮助我们。 – RQDQ 2011-03-01 00:46:05

+0

今晚我会在我工作一天后做。感谢你目前的帮助。 – twittfort 2011-03-01 11:20:45

+0

刚刚更新了更多细节的问题。 – twittfort 2011-03-01 17:08:50

回答

5

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

+0

我通过在测试机器上安装SQLite ADO.NET 4.0 Provider解决了这个问题。现在我得到另一个例外。但这只是一个超出界限的索引。我知道如何照顾;) 只是好奇:如何更改程序中的引用指向本地DLL? – twittfort 2011-03-01 17:21:38

+1

请按照此链接中的步骤(http://msdn.microsoft.com/zh-cn/library/7314433t%28v=vs.80%29.aspx)删除存储在GAC中的引用,将该DLL复制到在您的项目中新建lib目录,然后添加对其的引用。 – 2011-03-01 21:39:40

2
  1. 尝试引用GAC
  2. 你提供正确的版本(即32比64位)以外的版本?

我也有这个问题,我认为第一点修正了它。你部署它的机器显然并不在gac中,如果你引用了这个版本,它将不会在其他地方找到。至少这是我的经历。

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

在解决完全没有找到程序集的问题之后,这也是必要的 - 您的问题将解决找不到在提供程序集后发生的提供程序问题。 – Femaref 2011-03-01 00:59:37

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

希望这有助于克里斯托夫

+0

PS:我也尝试从GAC中删除System.Data.SQLite,但它告诉我: 无法卸载:程序需要一个或多个应用程序 待定参考: 程序: ID:描述:< Windows Installer> – Christoph 2011-08-25 01:44:45

2

您可以使用DEPENDS.EXE找到DLLs,它们将被注册到System.Data.SQLite.dll库。

在我的情况下,System.Data.SQLite.dll不希望加载没有msvcr100.dll(C运行时库本地代码)。将它添加到应用程序目录解决了这个问题。

注意:C运行时库依赖于平台!

相关问题