我在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”或找不到依赖。
该文件存在于应用程序目录中。这是一个文件列表:
答案 0 :(得分:5)
如果从C#项目引用存储在开发机器上的GAC中的System.Data.SQLite.dll中存储的DLL,并且测试客户端上不存在该DLL,则会收到该消息。在这种情况下,您需要在测试计算机上安装SQLlite(从而将DLL放在GAC中),或者更改项目中的引用以指向本地DLL instaid。
答案 1 :(得分:2)
我也有这个问题,我认为第一点是修正了它。您部署它的机器显然没有它在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运行时库与平台有关!