Visual Studio中的引用项目和直接引用DLL文件
在VS中引用类库时有多种方法,其中用的最多的就是在引用时选择项目选项卡引用本解决方案下的类库项目和选择浏览选项卡直接引用类库DLL文件,实际上这两种引用方式略有不同,今天就为大家总结下。
C#本地项目(控制台,winform)
- 引用类库项目,这时对引用DLL类库做出任何修改会立刻生效,不用保存和生成类库。如果删除类库项目,则本项目中引用的DLL也被删除。
- 引用类库DLL,这时对类库的修改,需要先生成类库项目,再生成本项目才会生效。 如果删除或改变类库DLL的目录,则本项目中的引用会指向本项目bin\debug目录下生成的DLL(但是前提是在删除或改变类库DLL的目录后,不要立即重新生成本解决方案,因为重新生成解决方案和生成解决方案的原理不一样,重新生成解决方案时VS会先清空本项目bin\debug目录下原先生成的DLL类库文件也就是先清空解决方案,再生成本解决方案,而这时本项目bin\debug目录中已经没有原先生成的DLL类库文件了,生成解决方案时当然会报错,你必须先生成解决方案或运行本项目,这时本项目中的引用才会指向本项目bin\debug目录下原先生成的DLL类库文件,并将这个新的引用信息保存到项目文件,这时你再重新生成解决方案VS就不会去删除bin\debug目录下原先生成的DLL类库文件了,但是如果该DLL类库又引用了其它类库项目(即本项目和这些其它的类库项目之间是间接引用关系,关于间接引用详情请见后面的附加内容),那么这时对本项目重新生成解决方案,VS还是会去将bin\debug目录下该DLL类库文件引用的其它类库项目的DLL文件给删除掉,所以这时如果本项目引用的DLL类库调用了这些其它类库项目中的代码可能会报错,所以请不要轻易去删除或改变项目中所引用DLL类库文件的目录)。但是如果还原该类库DLL到原目录,则本项目中的引用又会指向该类库DLL。
- 以上无论哪种方式都要将引用的DLL文件的属性设置为复制到本地,否则运行本项目时会报错。
ASP.NET Web应用程序
- 引用类库项目,这时对引用DLL类库做出任何修改会立刻生效,不用保存和生成类库。如果删除类库项目,则本项目中引用的DLL也被删除。
- 引用类库DLL,这时对类库的修改,需要先生成类库项目,再生成本项目才会生效。 如果删除或改变类库DLL的目录,则本项目中的引用会指向本项目bin目录下生成的DLL(但是前提是在删除或改变类库DLL的目录后,不要立即重新生成本解决方案,因为重新生成解决方案和生成解决方案的原理不一样,重新生成解决方案时VS会先清空本项目bin目录下原先生成的DLL类库文件也就是先清空解决方案,再生成本解决方案,而这时本项目bin目录中已经没有原先生成的DLL类库文件了,生成解决方案时当然会报错,你必须先生成解决方案或运行本项目,这时本项目中的引用才会指向本项目bin目录下原先生成的DLL类库文件,并将这个新的引用信息保存到项目文件,这时你再重新生成解决方案VS就不会去删除bin目录下原先生成的DLL类库文件了,但是如果该DLL类库又引用了其它类库项目(即本项目和这些其它的类库项目之间是间接引用关系,关于间接引用详情请见后面的附加内容),那么这时对本项目重新生成解决方案,VS还是会去将bin\debug目录下该DLL类库文件引用的其它类库项目的DLL文件给删除掉,所以这时如果本项目引用的DLL类库调用了这些其它类库项目中的代码可能会报错,所以请不要轻易去删除或改变项目中所引用DLL类库文件的目录)。但是如果还原该类库DLL到原目录,则本项目中的引用又会指向该类库DLL。
- 以上无论哪种方式都要将引用的DLL文件的属性设置为复制到本地,否则运行本项目时会报错。
ASP.NET 网站
- 引用类库项目,这时对引用DLL类库做出任何修改会立刻生效,不用保存和生成类库。如果删除类库项目,则本项目中引用的DLL也被删除。
- 引用类库DLL,这时对类库的修改,需要先生成类库项目,再生成本网站项目才会生效。 如果删除或改变类库DLL的目录,本项目中的引用还是会指向原先DLL类库文件的目录(不过ASP.NET网站是通过refresh文件指向该DLL文件的地址),不会指向本项目Bin目录下生成的DLL,但是在对本项目生成解决方案时,会产生一个警告指示找不到所引用DLL类库项目的原始文件,如果还原该DLL类库到原目录,警告就会消失。此外对ASP.NET网站项目重新生成解决方案时,VS不会去删除本项目Bin目录下的任何文件,所以即便是删除或改变本项目所引用DLL类库文件的目录,由于本项目的Bin目录下的所有DLL文件都还在,因此本项目的所有代码还是可以正确运行。
- ASP.NET 网站引用的DLL文件都会复制到本网站的Bin目录。
附加内容:这里顺便谈谈类库引用链中的直接引用和间接引用的一个小问题 首先来谈谈什么叫引用链,大家知道C#项目中的类库还可以引用其它的类库,那么假如现在有3个类库:LibA、LibB、LibC,这三个类库存在引用关系:LibA<-LibB<-LibC(其中A<-B表示类库B引用类库A生成的DLL文件),那么我们就说这三个类库LibA<-LibB<-LibC是一条引用链(LibA是引用链的头,LibC是引用链的末尾)。
- 直接引用:直接引用表示两个类库在引用链中的位置是相邻的,比如上面的LibA和LibB以及LibB和LibC。
- 间接引用:间接引用表示两个类库在引用链中的位置是不相邻的,比如上面的LibA和LibC。
在引用链的直接引用关系中,比如LibA<-LibB,我们都知道,类库项目LibB在生成后会将类库项目LibA生成的DLL文件,复制到LibB项目自己的bin/Debug目录下,这没有什么问题。在引用链的间接引用中,比如LibA<-LibB<-LibC中,我们知道生成该引用链中的三个类库项目后,LibC的bin/Debug目录下肯定有LibB.DLL,因为LibC和LibB是直接引用关系,LibB的bin/Debug目录下肯定有LibA.DLL,因为LibB和LibA是直接引用关系。但是问题是LibC的bin/Debug目录下是否也有和其存在间接引用关系的类库项目LibA的DLL文件LibA.DLL?
经过多次试验,我发现如果类库项目LibB中使用了类库项目LibA中的成员时(即LibB不仅引用了LibA的DLL文件,还使用了LibA的DLL文件,比如调用了LibA的方法,声明了LibA中类的对象等,但切记只用using导入LibA中的命名空间不叫使用),那么在引用链LibA<-LibB<-LibC生成后,类库项目LibC的bin/Debug目录下会同时生成LibA.DLL和LibB.DLL。但是如果类库项目LibB中没有使用类库项目LibA中的成员时(即LibB只引用了LibA,但是LibB中完全没有使用LibA),类库项目LibC的bin/Debug目录下就只有LibB.DLL。
所以你会发现其实VS在生成引用链时很聪明,因为在生成LibA<-LibB<-LibC中的LibC时,VS会去查看与LibC存在直接引用关系的类库项目LibB的生成目录bin/Debug下有几个DLL文件,那么在本例中由于LibA和LibB是直接引用关系,那么LibB的bin/Debug下肯定有两个DLL文件LibA.DLL和LibB.DLL。那么这时VS就会去探查LibB.DLL中是否使用了LibA.DLL。如果使用了VS就会把LibA.DLL、LibB.DLL同时Copy到LibC的bin/Debug目录下。如果没有使用LibA.DLL,那么VS会认为LibA.DLL是多余的,只会把LibB.DLL Copy到LibC的bin/Debug目录下。
但是上面这段话不是绝对的,因为我发现如果将引用链末端的类库项目LibC换成Asp.net网站或Asp.net应用程序,其生成DLL文件的原理是不一样的,说明.net的每种项目引用DLL文件时都有自己的一套生成规则,上面只讨论了类库项目的生成规则。
Visual Studio中的引用项目和直接引用DLL文件的更多相关文章
- Web 应用程序项目与 Visual Studio 中的网站项目的异同
要查看英语原文,请勾选“英语”复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 本文档已存档,并且将不进行维护. Web 应用程序项目与 Visual Studio 中的网站项 ...
- [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考
[Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...
- (15)Visual Studio中使用PCL项目加入WCF WebService参考
原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2 ...
- 在Visual Studio中新增生成项目
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构
- Visual Studio中的.suo(Solution User Options)文件
其实关于.suo文件,官方文档和网上很多资料就说明的十分详细了,本文主要按照我自己的理解将其整理归纳成一篇笔记以备日后查看..suo文件全称为:Solution User Options,看了很多资料 ...
- Visual Studio中用于ASP.NET Web项目的Web服务器
当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...
- Visual Studio 中指定自定义生成事件
自定义生成事件打开方式 通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令.在Visual Studio中通过右键项目->属性 进入项目属性菜单. 自定义生成事件的语法 生成事 ...
- 在visual studio中运行C++心得
1.在visual studio中建立C++项目 (1)新建->项目->空项目 C++ (2)右击项目->添加->新建项->C++文件(.app) (3编写C++文件 ...
- 在Visual Studio 中使用git——文件管理-中(五)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- 在Visual Studio 中使用git——文件管理-下(六)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
随机推荐
- windows linux 使用python执行系统命令并将结果保存到变量
最近需要用到os.system 发现不能赋值到变量 后查有更新的模块,如下: os.system os.spawn* os.popen* popen2.* commands.* 重新使用content ...
- nodejs处理页面跳转url地址的处理
使用status函数设置状态码 router.get("/list/:id",(req,res)=>{ let id = req.params.id; res.locals. ...
- MySql中的视图的概念及应用
视图的基本概念 视图是从一个或几个基本表(或者视图)导出的表.它与基本表不同,是一个虚表. 数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中.所以基本表中的数据发生变化, ...
- 会话临时表 ORA-14452
需要使用Oracle的临时表,向其中插入记录,用完后再删除.但是后来发现临时表的删除总是失败,返回错误: ORA-14452: attempt to create, alter or drop an ...
- 《鸟哥的Linux私房菜》读书笔记3
1. bash shell变量设定: name=myname,(不加空格) echo $name 注意: 若myname中有空格,则用单引号或者双引号("内特殊字符保留变量特性,'内特殊字符 ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
- C++基础之类和对象二
(1)指向类的成员的指针分为指向数据成员的指针和指向成员函数的指针两种.一个类的对象用运算符“.*”来操作指向该类成员的指针,而一个指向类的对象的指针用运算符“->”来操作指向该类成员的指针.( ...
- MySQL中的正则表达式
正则表达式是用正则表达式语言来建立 基本字符的匹配 .是正则表达式语言中的一个特殊的字符,它表示匹配任意一个字符 在LIKE和REGEXP之间有一个重要的差别,LIKE匹配整个列,如果被匹配的文本仅在 ...
- 使用pods添加第三方的时候,出现ld: library not found for -lpop
ld: library not found for -lpop 错误,是在使用pods添加第三方的时候,出现的编译错误,同时伴随着的是error: linker command failed with ...
- 关于map 及 map 骚操作
关于map这个东西 很冷门.................. 但是,这个博客带你稍微了解一下map: map用法:一般当作一个下表无穷大的数组 关于它的骚操作:map的鬼畜用法,可以 ...