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


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

 一、搭建Demo

  這里就以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/

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM