使用C#開發,我們經常引用各種類庫,我們通常是在Visual Studio中引用上面單擊右鍵,添加引用...,瀏覽...,選擇dll,確定,但是這樣做會不會有什么問題呢?當然,有人到現在為止沒有碰到過問題,下面來一個實例,來說一下其中可能出現的問題。
這里就以SQLite數據庫為例吧,我們新建一個控制台項目,名字就叫做SQLiteDemo吧,然后在項目中添加Lib文件夾,放入SQLite要用的dll和xml配置文件,然后添加對System.Data.SQLite.dll的引用,項目結構如下:
下面開始編寫代碼,訪問SQLite數據庫,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SQLite; namespace SQLiteDemo { class Program { static void Main(string[] args) { try { string connStr = "Data Source=test.db;Version=3;"; SQLiteConnection conn = new SQLiteConnection(connStr); string sql = "CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL);"; SQLiteCommand cmd = new SQLiteCommand(sql, conn); cmd.ExecuteNonQuery(); } catch(Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } }
到這里,看起來沒有任何問題,是吧!先不說我寫的SQL對不對,下面我們來運行項目看看會發生什么,在catch語句處下斷點,結果你會看到出現異常了,如圖:
看異常信息的意思是找不到SQLite.Interop.dll,再看看lib文件夾下面,在那里靜靜的躺着呢,和System.Data.SQLite.dll在一起的呀~為什么會找不到呢?
到這里,我們首先想到的是dll版本不對吧?系統是32位的還是64位的?重新下載dll試試?等等,很多種可能,經過種種嘗試后,發現到最后都不行。當然,你想到了沒有引用SQLite.Interop.dll,你去添加引用,出現下面的錯誤提示:
提示SQLite.Interop.dll不是有效的dll,是不是dll損壞了?重新下載,還是這樣的問題。到底怎么回事呢?
提示:其實SQLite.Interop.dll根本就不是用C#編寫的dll,當然引用不了了,它只是System.Data.SQLite.dll的依賴項。
下面來分析一下問題到底出在哪里?
我們在引用中選中System.Data.SQLite,查看它的屬性,如圖:
看到它的Copy Local屬性為True,然后進入Debug目錄看看,里面也有了,確實被復制過去了。
看圖中,System.Data.SQLite.xml也被復制過來了,到這里大家都清楚了吧,正是由於SQLite.Interop.dll跟System.Data.SQLite.dll不在一個目錄下,所以才出現找不到SQLite.Interop.dll的錯誤。
解決辦法就是把SQLite.Interop.dll復制到Debug目錄即可。
但是,有人說我就不復制,把Copy Local屬性改為False不就行了,就是這么任性怎么滴?好吧,我們來試試,看會發生什么?看圖吧:
出錯了吧,現在連System.Data.SQLite都找不到了,還是乖乖的該回去吧,有時候任性真的不好~
可見,我們每次添加引用,在編譯的時候,VS都會把被引用的dll拷貝到程序集的目錄下,比如我們的項目有一些dll不是用C#編寫的,應用不了,我們要把它拷貝到調用它的程序同目錄下。
注意:如果我們在dll中引用了System.Data.SQLite.dll,最終這個dll又被調用,我們要把SQLite.Interop.dll拷貝到最終調用者的目錄下,比如winform的主程序目錄。
小技巧Get:
1、我們在解決方案上面點擊鼠標右鍵,清理項目,然后在打開Debug目錄,會發現變的干干凈凈,引用拷貝過來的dll都被刪除了,所以我們拷貝一些大的項目時,可以先清理一下項目,再拷貝,會快不少哦~~
2、項目引用層次盡量要簡單,不要出現多級的引用。
3、使用了第三方控件的大型項目為什么編譯很慢?就是因為編譯時拷貝引用項,引發大量的磁盤IO,會占用部分時間。
如果大家感覺我的博文對大家有幫助,請推薦支持一把,給我寫作的動力。
作者:雲霏霏
博客地址:http://www.cnblogs.com/yunfeifei/
聲明:本博客原創文字只代表本人工作中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關系。非商業,未授權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接。