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 中使用 ...
随机推荐
- B/S测试与C/S测试之区别
我们在日常功能测试工作中,常常依据测试对象和测试目标的不同分为四个级别的测试,单元测试.集成测试.系统测试和验收测试,但是往往忽略了被测应用系统架构.在测试过程中针对不同的系统架构,测试的侧重点也不同 ...
- 用python做的windows和linx文件夹同步。解决自动同步、加快传输大量小文件的速度、更丰富的文件上传过滤设置。
现在工具不好用,用的pycharm自动同步,但对于git拉下来的新文件不能自动上传到linux,只有自己编辑过或者手动ctrl + s的文件才会自动同步.导致为了不遗漏文件,经常需要全量上传,速度非常 ...
- 韩顺平循序渐进学JAVA从入门到精通 视频全套,需要的联系我
0讲-开山篇.avi 10讲-访问修饰符.重载.覆盖.avi 11讲-约瑟夫问题.avi 12讲-多态.avi 13讲-抽象类.接口.avi 14讲-final.作业评讲.avi 15讲-作业.测试题 ...
- 每天一道算法题(1) ——不用乘除法求和1+2+…+n
题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 方法1:使用函数指针. typedef int (*fu ...
- Java探索之旅(8)——继承与多态
1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...
- Python学习:命令行运行,循环结构
一.安装配置和运行方法 1.安装OpenCV 3.1: 假设安装目录为"C:\Python34" 2.配置环境变量: 方法一:直接配置:打开"控制面板",搜索& ...
- Jmeter进行简单mysql数据库测试
1.环境准备: mysql: mysql-5.7.17.msi jdbc驱动: 自己百度一下即可 Jmeter: 3.2 2.打开Jmeter,创建测试计划, 点击浏览,添加jdbc驱动 3.添 ...
- 31、SAM文件中flag含义解释工具--转载
转载:http://www.cnblogs.com/nkwy2012/p/6362996.html SAM是Sequence Alignment/Map 的缩写.像bwa等软件序列比对结果都会输出这 ...
- TMF大数据分析指南 Unleashing Business Value in Big Data(二)
前言 此文节选自TMF Big Data Analytics Guidebook. TMF文档版权信息 Copyright © TeleManagement Forum 2013. All Righ ...
- SQL Server事务回滚对自增键的影响
SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值:select @@ ...