天天看點

用VS添加引用dll也會出錯?你遇到過嗎?

  使用C#開發,我們經常引用各種類庫,我們通常是在Visual Studio中引用上面單擊右鍵,添加引用...,浏覽...,選擇dll,确定,但是這樣做會不會有什麼問題呢?當然,有人到現在為止沒有碰到過問題,下面來一個執行個體,來說一下其中可能出現的問題。

 一、搭建Demo

  這裡就以SQLite資料庫為例吧,我們建立一個控制台項目,名字就叫做SQLiteDemo吧,然後在項目中添加Lib檔案夾,放入SQLite要用的dll和xml配置檔案,然後添加對System.Data.SQLite.dll的引用,項目結構如下:

用VS添加引用dll也會出錯?你遇到過嗎?

下面開始編寫代碼,通路SQLite資料庫,代碼如下:

到這裡,看起來沒有任何問題,是吧!先不說我寫的SQL對不對,下面我們來運作項目看看會發生什麼,在catch語句處下斷點,結果你會看到出現異常了,如圖:

用VS添加引用dll也會出錯?你遇到過嗎?

看異常資訊的意思是找不到SQLite.Interop.dll,再看看lib檔案夾下面,在那裡靜靜的躺着呢,和System.Data.SQLite.dll在一起的呀~為什麼會找不到呢?

 二、分析錯誤的緣由

   到這裡,我們首先想到的是dll版本不對吧?系統是32位的還是64位的?重新下載下傳dll試試?等等,很多種可能,經過種種嘗試後,發現到最後都不行。當然,你想到了沒有引用SQLite.Interop.dll,你去添加引用,出現下面的錯誤提示:

用VS添加引用dll也會出錯?你遇到過嗎?

提示SQLite.Interop.dll不是有效的dll,是不是dll損壞了?重新下載下傳,還是這樣的問題。到底怎麼回事呢?

提示:其實SQLite.Interop.dll根本就不是用C#編寫的dll,當然引用不了了,它隻是System.Data.SQLite.dll的依賴項。

下面來分析一下問題到底出在哪裡?

我們在引用中選中System.Data.SQLite,檢視它的屬性,如圖:

用VS添加引用dll也會出錯?你遇到過嗎?

看到它的Copy Local屬性為True,然後進入Debug目錄看看,裡面也有了,确實被複制過去了。

用VS添加引用dll也會出錯?你遇到過嗎?

看圖中,System.Data.SQLite.xml也被複制過來了,到這裡大家都清楚了吧,正是由于SQLite.Interop.dll跟System.Data.SQLite.dll不在一個目錄下,是以才出現找不到SQLite.Interop.dll的錯誤。

解決辦法就是把SQLite.Interop.dll複制到Debug目錄即可。

但是,有人說我就不複制,把Copy Local屬性改為False不就行了,就是這麼任性怎麼滴?好吧,我們來試試,看會發生什麼?看圖吧:

用VS添加引用dll也會出錯?你遇到過嗎?

出錯了吧,現在連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/

 聲明:本部落格原創文字隻代表本人工作中在某一時間内總結的觀點或結論,與本人所在機關沒有直接利益關系。非商業,未授權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。