2011-03-01 69 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運行時庫依賴於平臺!