用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也会出错?你遇到过吗?的更多相关文章
- "未能找到类型或命名空间名称",引用dll的时候出错
当前项目是.net2.0框架,引用的dll是 .net 4.5框架,引用后编译时报错“未能找到类型或命名空间名称”. 当前项目 右键-->应用程序-->目标框架 改为 .net frame ...
- VS 项目没有“添加引用”选项
出问题的环境:vs2017,unity2017unity创建工程后,vs打开项目后,无法添加引用dll,没有“添加引用”项原因: 需要把目标框架改为.
- 未能添加对***.dll的引用 问题解决方法
这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...
- 未能添加对***.dll的引用问题
在机器A上运行.编译成功的程序,在B上不能正确被编译,并且添加r如 knbook.dll 时候提示如下: 未能添加对"knbook.dll"引用,请确保此文件可以访问并且是一个有效 ...
- vs2017添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL
1.以管理员身份打开 Developer Command Prompt for VS 2017(vs2017开发人员命令提示符) 2.定位到你的vs2017的安装目录 例:E:\Program Fil ...
- Microsoft.mshtml.dll 添加引用及类型选择错误问题解决办法
在比较早的文章中,提到使用 Microsoft.mshtml.dll 进行模拟浏览器点击的例子. 1.添加引用的问题 一般在开发环境下会在三个地方存有microsoft.mshtml.dll文件.所以 ...
- C# 注册DLL至GAC 并在添加引用中使用该DLL
本文链接:https://blog.csdn.net/World3000/article/details/819835901,创建一个强签名的类库 类库属性中新建秘钥文件 或者使用工具 使用命令sn ...
- C# dll文件添加引用失败
未能添加对“***/***.dll”的引用.请确保此文件可访问并且是一个有效的程序集或 COM 组件. 原因:dll文件使用其他语言生成,C#无法识别 解决方法: 添加using System.Run ...
- NuGet更新引用Dll
第一种 通过 "Add Library Package Reference..." 添加 点击 ‘Add Library Package Reference...’ , 搜索你要添 ...
随机推荐
- What's VPC (by quqi99)
作者:张华 发表于:2014-12-09版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) VPC ...
- vim 查看文件二进制格式
用vim打开文件,vim -b file,选项-b是二进制模式打开 然后输入 :%!xxd,就可看到二进制编码 其实在linux下,直接输入xxd file 也是可以看到的文件二进制格式的
- Ext开场表单布局设计
var form = new Ext.form.FormPanel({ labelAlign: 'right', labelWidth: 60, buttonAlign: 'center', titl ...
- 使用ycsb测试cassandra
参考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-wit ...
- linux命令连接远程服务器
ssh root@IP ***连接远程ip cd 路径 ***进入指定路径 ll ***查看当前文件 ll -a ...
- 大前端学习笔记整理【四】LESS基础
第一次接触CSS预编译,然后对比后发现其实less的上手容易度确实比sass高不少,再加上公司项目也是使用的less.所以想想还是根据网上的各种教程,整理出来了一些比较基础的.而且比较能让我们这种初学 ...
- GPT分区磁盘上优盘安装win10的方法
刚买的acer笔记本安装的是win8,之后硬盘安装升级到win10.今天想格式化安装win10这样自带的软件可以去除,但是nt6 hdd在win10上无法使用,本来想先安装win7再通过nt6 hdd ...
- jQuery外链新窗口打开
对于外链,为了留住用户在本站,我们通常会使用新窗口打开,你可以设置target="_blank".然而手动一个是麻烦,另一个则是有可能会遗漏,本文通过jQuery查询要点击的链接, ...
- Windows下nginx+php配置
1. 首先,将 nginx.conf 中的 PHP 配置注释去掉. # pass the PHP scripts to FastCGI server listening on # #location ...
- GitHub开源项目总结
SwipeRefreshLayout 地址:https://github.com/hanks-zyh/SwipeRefreshLayout 首页轮播的Tab样式,PagerSlidingTab 地址: ...