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 中使用 ...
随机推荐
- oracle中创建sequence指定起始值
oracle中创建sequence指定起始值 DECLARE V_Area_Id NUMBER; BEGIN SELECT MAX(T.Area_Id)+10 INTO V_Area_Id FROM ...
- 关于 sklearn.decomposition.KernelPCA的简单介绍
from sklearn import decomposition import numpy as np A1_mean = [1, 1] A1_cov = [[2, .99], [1, 1]] A1 ...
- Luogu 2258 [NOIP2014] 子矩阵
被普及组虐了,感觉
- 由count(sno)和count(cno)引发的思考
最近在练习sql语句,在一个select查询语句上有理解性偏差,现整理汇总下相关知识点. 首先,说下这个问题吧. 问题是:查询选课人数大于等于2人的课程编号以及选课的人数 具体的表结构信息: 我自己的 ...
- 6.2 卸载原来的Ubuntu,重新安装Ubuntu
6.1日其实已经成功安装了Ubuntu,6.2日打开电脑,进入Ubuntu系统,发现自己6.1日保存的工作,比如下载的文档和做的笔记,都不在Ubuntu系统中了.当时觉得特别奇怪,第一反应就是,我的U ...
- Struts2学习第三课 Action
action VS Action类 action:代表一个Struts2的请求 Action类:能够处理struts2请求的类. 属性的名字必须遵守与JavaBean属性名相同的命名规则. 属性的 ...
- Ubuntu14跑DSO
按照https://github.com/JakobEngel/dso上的说明,make -j4的时候出现一下错误: /home/zhao/dso/src/FullSystem/CoarseIniti ...
- 从阿里中台战略看企业IT架构转型之道
此文是我阅读<企业IT架构转型之道>一书的学习笔记,所有内容出自钟华老师的这本书. 零.为何读<企业IT架构转型之道> 在加入X公司后,开始了微服务架构的实践,也开始了共享平台 ...
- Java中Class Type 类类型是怎么回事?
Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...
- iOS模拟器的应用沙盒在MAC中的位置
每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径 ...