用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...’ , 搜索你要添 ...
随机推荐
- JDK、JRE、JVM三者间的关系
JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库.Java Runtime Enviro ...
- ctrip
#-*-coding:utf8-*-from lxml import etreeimport requestsimport re#编码转换import sysreload(sys)sys.setdef ...
- Powerdesigner 设置唯一约束
- easyui form表单提交应注意的问题
今天在一个项目中用到表单提交,代码如下: $('#CreateForm').form('submit', { onSubmit: function () { ajaxCreateFrom(this, ...
- iOS基础之Xcode 8相关
1.屏蔽日志输出 2.注释相关 注释不能使用:命令运行: sudo /usr/libexec/xpccachectl VVDocument方式注释快捷键:option + command + /
- 51nod 1428 活动安排问题(优先队列)
1428 活动安排问题 首先按照开始时间从小到大排序. 其实只要维护一个结束时间的最小堆,每次比较开始时间和堆中最小时间的大小,如果比它大就放入堆中并且时间就要变成当前任务的结束时间, 否则就要新开一 ...
- 解决拖拽有内容的div的bug和兼容问题
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...
- IT小喇叭-企业品牌宣传、产品营销推广的首选
IT小喇叭-企业品牌宣传.产品营销推广的首选 IT小喇叭,成立于2015年6月初,成都芮嘉科技有限公司旗下产品,主要进行媒体资源整合.宣传报道:使移动互联网等相关企业的产品宣传.品牌营销变得更加方便. ...
- linux系统启动时更改MAC地址
vim /etc/rc.local #change the server's MAC address("00:50:56:84:5C:76" change to 00:50:56: ...
- Python 学习---------Day2
第四章 介绍Python对象类型为什么使用内置类型 内置对象使程序更容易编写 内置对象是拓展的组件 内置对象往往比定制的数据结构更有效率 内置对象是语言标准的一部分Python的核心数据类型 数字 字 ...