使用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/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

用VS添加引用dll也会出错?你遇到过吗?的更多相关文章

  1. "未能找到类型或命名空间名称",引用dll的时候出错

    当前项目是.net2.0框架,引用的dll是 .net 4.5框架,引用后编译时报错“未能找到类型或命名空间名称”. 当前项目 右键-->应用程序-->目标框架 改为 .net frame ...

  2. VS 项目没有“添加引用”选项

    出问题的环境:vs2017,unity2017unity创建工程后,vs打开项目后,无法添加引用dll,没有“添加引用”项原因: 需要把目标框架改为.

  3. 未能添加对***.dll的引用 问题解决方法

    这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...

  4. 未能添加对***.dll的引用问题

    在机器A上运行.编译成功的程序,在B上不能正确被编译,并且添加r如 knbook.dll 时候提示如下: 未能添加对"knbook.dll"引用,请确保此文件可以访问并且是一个有效 ...

  5. vs2017添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL

    1.以管理员身份打开 Developer Command Prompt for VS 2017(vs2017开发人员命令提示符) 2.定位到你的vs2017的安装目录 例:E:\Program Fil ...

  6. Microsoft.mshtml.dll 添加引用及类型选择错误问题解决办法

    在比较早的文章中,提到使用 Microsoft.mshtml.dll 进行模拟浏览器点击的例子. 1.添加引用的问题 一般在开发环境下会在三个地方存有microsoft.mshtml.dll文件.所以 ...

  7. C# 注册DLL至GAC 并在添加引用中使用该DLL

    本文链接:https://blog.csdn.net/World3000/article/details/819835901,创建一个强签名的类库 类库属性中新建秘钥文件 或者使用工具 使用命令sn ...

  8. C# dll文件添加引用失败

    未能添加对“***/***.dll”的引用.请确保此文件可访问并且是一个有效的程序集或 COM 组件. 原因:dll文件使用其他语言生成,C#无法识别 解决方法: 添加using System.Run ...

  9. NuGet更新引用Dll

    第一种 通过 "Add Library Package Reference..." 添加 点击 ‘Add Library Package Reference...’ , 搜索你要添 ...

随机推荐

  1. SQL Server 常用函数

    1.DATEADD 在向指定日期加上一段时间的基础上,返回新的 datetime 值. 语法 DATEADD ( datepart , number, date ) 参数 datepart 是规定应向 ...

  2. 运用requirejs的异步加载方式

    很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...

  3. html中 table 和 form的位置

    对于web前端开发来说  经常会用到 像firebug这样审查元素 工具 发现了一个这样的现象: 当 able><form><tr>....</tr>< ...

  4. java访问ftp的一些操作

    通过java代码来访问ftp服务器,进行下载操作

  5. SQL Server客户端登录名与数据库用户关联

    数据库迁移之后,在新的SQL Server客户端工具设置关联时,往往会报错: 用户.组或角色 'XXX' 在当前数据库中已存在. 解决方法: 首先介绍一下sql server中“登录”与“用户”的区别 ...

  6. 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法

    最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...

  7. selenium-pageobject设计模式

    from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepfrom ...

  8. Android Sqlite 工具类封装

    鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...

  9. MAC PRO 的网关在哪里

    mac pro的网关就是路由器地址. 1.路由器在系统偏好设置里 2.双击点开此图标 选中1.然后点击高级设置 3.选中TCP/IP,然后查看自己的路由器后边的数字,就是你的mac网关号 4.IPV4 ...

  10. AKI

    KDIGO 2012定义:尿量<0.5ml/kg/h 6h+:scr上升50%+ 7d-:scr上升26.5 2d- 但面对录入窗口,又想不出说什么了,继续看aki?刚才想的是什么呢?入冬,好像 ...