首页 > 代码库 > 用VS添加引用dll也会出错?你遇到过吗?
用VS添加引用dll也会出错?你遇到过吗?
使用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/
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
用VS添加引用dll也会出错?你遇到过吗?