在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文件的更多相关文章

  1. Web 应用程序项目与 Visual Studio 中的网站项目的异同

    要查看英语原文,请勾选“英语”复选框.也可将鼠标指针移到文本上,在弹出窗口中显示英语原文. 翻译 英语 本文档已存档,并且将不进行维护. Web 应用程序项目与 Visual Studio 中的网站项 ...

  2. [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考、NuGet组件参考

    [Xamarin.iOS] Visual Studio中Xamarin.iOS项目,无法加入PCL项目参考.NuGet组件参考 解决方案 目前Visual Studio中最新版本的Xamarin.iO ...

  3. (15)Visual Studio中使用PCL项目加入WCF WebService参考

    原文 Visual Studio中使用PCL项目加入WCF WebService参考 Visual Studio中使用PCL项目加入WCF WebService参考 作者:Steven Chang 2 ...

  4. 在Visual Studio中新增生成项目

    在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构

  5. Visual Studio中的.suo(Solution User Options)文件

    其实关于.suo文件,官方文档和网上很多资料就说明的十分详细了,本文主要按照我自己的理解将其整理归纳成一篇笔记以备日后查看..suo文件全称为:Solution User Options,看了很多资料 ...

  6. Visual Studio中用于ASP.NET Web项目的Web服务器

    当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...

  7. Visual Studio 中指定自定义生成事件

    自定义生成事件打开方式 通过指定自定义生成事件,可以在生成开始之前或在它完成之后自动运行命令.在Visual Studio中通过右键项目->属性 进入项目属性菜单. 自定义生成事件的语法 生成事 ...

  8. 在visual studio中运行C++心得

    1.在visual studio中建立C++项目 (1)新建->项目->空项目 C++ (2)右击项目->添加->新建项->C++文件(.app) (3编写C++文件   ...

  9. 在Visual Studio 中使用git——文件管理-中(五)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  10. 在Visual Studio 中使用git——文件管理-下(六)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

随机推荐

  1. 进程vs线程

    内存中的内容不同 进程->{ 进程是系统分配资源的最基本单位,线程是进程的一部分, 进程中存储文件和网络句柄 } 线程->{ 栈(每个线程都有一个栈空间) pc(当前或下一条指令的地址,指 ...

  2. VC 绘图,使用双缓冲技术实现

    VC 绘图,使用双缓冲技术实现 - Cloud-Datacenter-Renewable Energy-Big Data-Model - 博客频道 - CSDN.NET VC 绘图,使用双缓冲技术实现 ...

  3. RN控件之ProgressBarAndroid进度条

    /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; import Rea ...

  4. python的语法糖

    # -*- coding: utf-8 -*-def deco(func): print("before myfunc() called.") func() print(" ...

  5. Umbraco back office 中templates显示不出来问题解决 (一片空白)

    在公司一个项目中,遇到一个问题,登录Umbraco back office,该项目的settings => Templates 已经有该项目的10几个view (templates), 但是,点 ...

  6. Citrix 未注册解决办法

    Citrix 经常出现未注册的问题 是因为DNS的解析 问题 ping DDC 的全名你会发现ping 不通 解决方案如下 首先 在 192.168.1.145(图站)上饭解析一下DDC(控制中心19 ...

  7. 移动端与H5页面像素的差异与关系

    最近工作任务主要是移动端内嵌H5页面,一次与原生进行像素交互下,发现了这个天坑,再次做个记录

  8. CSS 框模型概述

    在 CSS 中,width 和 height 指的是内容区域的宽度和高度. 增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 ...

  9. matlab求定积分和不定积分

    matlab求定积分与不定积分 创建于2018-03-21 22:42 求定积分与不定积分是一件比较繁琐的事,但是我们可以借助matlab,下面与大家分享解决方法 材料/工具 matlab 求不定积分 ...

  10. sqlalchemy字段与mysql数据库字段对应问题

    字段类型是在定义模型时, 对每个 Column 的类型约定. 不同类型的字段类型在输入输出上, 及支持的操作方面, 有所区别. 这里只介绍 sqlalchemy.types.* 中的类型, SQL 标 ...