用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...’ , 搜索你要添 ...
随机推荐
- Ceph剖析:Leader选举
作者:吴香伟 发表于 2014/09/11 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 Paxos算法存在活锁问题.从节点中选出Leader,然后将所有对数据 ...
- Apizza可以进行本地调试,也可以进行跨域调试,但是需要chrome插件
装Apizza Chrome插件 1 1. 进入Apizza官方网站.注册账号,进入控制台,可以看到提示安装chrome插件 2. 进入google app商店,搜索apiano 找到对于插件安装 ...
- C# 在winform或者wpf中显示控制台窗口
这儿需要使用两个系统函数: BOOL WINAPI FreeConsole(void); //// 关闭控制台窗口,参考:http://msdn.microsoft.com/en-us/library ...
- 文件消息的简单样式demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ASP.NET MVC分页组件MvcPager 2.0版发布暨网站全新改版
MvcPager分页控件是在ASP.NET MVC Web应用程序中实现分页功能的一系列扩展方法,该分页控件的最初的实现方法借鉴了网上流行的部分源代码, 尤其是ScottGu的PagedList< ...
- andorid frameanimation
Android中的逐帧动画 先来说说什么是逐帧动画,逐帧动画是一种常见的动画形式(Frame By Frame),其原理是在“连续的关键帧”中分解动画动作,也就是在时间轴的每帧上逐帧绘制不同的内容,使 ...
- mysql解压缩安装(一)
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- project 2016 11 20 树的多项式
#include <iostream>#include <stack>#include <cmath>#include <sstream> using ...
- java 获取本地电脑的分辨率代码
1.代码: java.awt.Toolkit tk=java.awt.Toolkit.getDefaultToolkit(); java.awt.Dimension screenSize= ...
- window对象常用方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...