本文主要阐述一些Visual Studio开发下需要知道的少部分且比较实用的功能,也是很多人忽略的部分。一些不常用而且冷门的功能不在本文范围,当然本文的尾巴【.Net必知系列】纯属意淫,如有雷同,基情四射。。
- WEB项目版本发布时 Web.config 中 Web.Release.config 和 Web.Debug.config 的使用。
- 项目属性下【生成事件】使用。
- 快速分析未知架构和类调用结构的方式(VS2010/2012)。
有时候我们开发与发布Web应用程序时Web.Config中的配置可能不一样,比如数据库连接字符串。那在发布时想自动替换Web.config文件的内容如何办呢?特别是项目开发到后期配置节点越来越多,共同部分和差异部分经常使用<!--注释--> 来进行节点的切换,这样是不是觉得太麻烦了,现在我们就来解决这个问题,当然这只是演示比较常用的一种方式,至于其他方式不做言表。
大家看见的这个就是所说的3个经常看见但是下面2个一般没有人使用额配置文件, Web.Release/Debug.config内容描叙(默认新建项目会自动生成)
下面是Web.Release.config 和 Web.Debug.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 --> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <!-- In the example below, the "SetAttributes" transform will change the value of "connectionString" to use "ReleaseSQLServer" only when the "Match" locator finds an attribute "name" that has a value of "MyDB". --> <connectionStrings> <add name="AppConnection" connectionString="这里填写【测试环境连接字符串】或【正式环境的字符串】分别写在Release.config,Debug.config中" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> </configuration>
下面是Web.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <connectionStrings> <add name="AppConnection" connectionString="默认连接字符串"/> <add name="TestCommon" connectionString="公共使用的连接字符串"/> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
注意,我在Web.config的connectionStrings节点下 下建立2个 子节点用来比较发布后的效果,当发布后就会变成
下面是发布 后Web.config 的配置文件
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <connectionStrings>//注意这里的字符串变了,变成了release配置文件中的字符串 <add name="AppConnection" connectionString="发布环境连接字符串"/> <add name="TestCommon" connectionString="公共使用的连接字符串"/> </connectionStrings> <system.web> <compilation targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web> </configuration>
这样就自动把替换Web.config中需要替换的节点按照设定的模式进行处理了,下面具体看一下描叙语言吧。
这里面2句重要的语句是 xdt:Transform="SetAttributes" xdt:Locator="Match(name)" 这2个配置属性意思是,把Web.config中connectionStrings对应name为AppConnection的节点属性替换。
这里的语法来源于xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" 命名空间,那2个分开的文件中都需要导入才能使用。
简单讲一下常用配置属性
1 :locator属性
(1)Match;
这里你需要就是在你直接匹配的属性名。
<connectionStrings> <add name="Northwind" connectionString="connection string detail" providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Match(name)" /> </connectionStrings>
Engine会再你的Web.config中找到匹配name为Norhwind的就用上面的配置文件图替换。
(2)Condition 基于XPath,在Locator中应用有逻辑性的判断表达式。
<connectionStrings> <add name="Northwind" connectionString="connection string detail" providerName="System.Data.SqlClient" xdt:Transform="Replace" xdt:Locator="Condition(@name=’Northwind or @providerName=' System.Data.SqlClient')" /> </connectionStrings>
上面就是Name属性匹配‘Norhwind’的或providerName匹配System.Data.SqlClient的配置文件节点都会被替换。
2: Transform 属性
(1) Replace 表示所有匹配的节点都是替换
<assemblies xdt:Transform="Replace"> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> </assemblies>
其实这里描述文件时web.release.config,将要替换的文件时Web.config . (2) Remove 删除第一匹配的元素。
<assemblies xdt:Transform="Remove">
</assemblies>
(2)RemoveAll
<connectionStrings> <add xdt:Transform="RemoveAll"/> </connectionStrings>
(3)Insert
插入从父节点中插入,(authorization中插入<deny users="*" />)
<authorization> <deny users="*" xdt:Transform="Insert"/> </authorization>
(4)SetAttributes
<compilation batch="false" xdt:Transform="SetAttributes(batch)"> </compilation>
本功能和技巧大概就这里,具体详细的配置参考下面微软官方文档
https://msdn.microsoft.com/zh-cn/library/dd465326(v=vs.100).aspx
什么是生成事件呢,可以使用生成事件指定在生成开始之前或生成完成之后运行的命令。只有当生成成功到达生成过程中的这些时间点时,才执行生成事件。浅显易懂的说就是项目编译完毕后,你需要额外做些什么事情,这个在C#代码里面是做不了的,这样生成事件就派上用场了。
看到这个图是不是很熟悉呢,但具体用到过的同学有多少^_^。
生成事件分为【生成前】和【生成后】执行的命令函数,后期生成事件又可以指定
3种编译情况选项
常见生成事件举例:生成后DLL复制,转移
例子一:
我有一个解决方案【NetToolStudio】这个是我一个插件式项目,由于【NTS.SqlServer】该程序集只是一个插件实现的子集,所以不依赖主框架,不会自动复制到BIN目录,更不会帮我复制到【DBProvider】放置插件文件夹,故需要将NTS.SqlServer生成的dll拷贝到【DBProvider】目录。但是每次手动拷贝很麻烦,于是乎生成事件就派上用场了,生成事件里的命令行是支持dos命令的,在后期生成事件命令行中输入 “copy或xcopy [源文件全路径] 拷贝到的路径”。
xcopy /r /y $(TargetPath) $(SolutionDir)NTSDBProvider
这样就产生了这样一句dos命令
当然也可以想如图上的写多条命令语句。
大家看见里面有$(TargetPath) $(SolutionDir)这些是些什么啊?打开生成事件中的宏如下图所示。
看打了吧,这样我们可以拿到程序集和解决方案给我的一些宏命令,至于什么是宏命令,这里不做解释,可以使用就好。
本功能大概就这里,具体详细的配置参考下面微软官方文档
https://msdn.microsoft.com/zh-cn/library/ke5z92ks(v=vs.100).aspx
分享几个好用的批处理,也是常用哟。
查找当前执行目录的文件并复制.rar 【该批处理的功能可以把当前目录所有的DLL复制到当前的TEMP文件夹中】
DeleteBin.rar 【看名字就知道是删除所有VS生成的BIN目录和OBJ目录,打包时复制带走的好帮手】
大家有时候看开源代码和新入职一家公司看以前同仁写的代码是不是很纠结,没有文档,没有架构图,没有人问,但是项目已经维护了N年了,看起来好恶心啊,现在有2种VS自带的功能来快速浏览和建立起自己的逻辑思维图。
是的,就是我们在代码编辑窗体中右键后出现的,这2种代码视图和调用层次结构图是快速读懂别人代码的一种捷径。
1.VS 2010引进了一个新的“View Call Hierarchy (查看调用的层次结构)”的特性,允许你快速地发现你的代码库中的某个特定方法或属性是在何处被调用的,允许你快速地遍历(traverse)整个代码库的调用树形图(而不必运行或调试方案)。
2.上面的代码视图,微软叫做【Code Map 理解复杂代码】
首先来看看【查看调用的层次结构】
方法名称上右键后点击-》查看调用的层次结构,稍等几秒就会出现如下图
然后点击里面的【UpdateKeyWordToFile】节点,可以继续展开。
看是不是很爽,具体怎么看,请看红色标识,赶紧去尝试一下吧,具体还有很多功能,有很多惊喜。
再来看看代码(类)引用图【Code Map 理解复杂代码】
【类】或者【方法】名称上右键后点击-》在代码上查找所有引用,稍等几秒(看机器性能)就会出现如下图:
右键方法
右键类
如果大家觉得它仅仅只是看看而已就错了,当我们debug的时候也能显示当先调用方法的具体位置和层次,能看清前后的调用顺序。
当我打了断点后,右图也会显示一个断点图标,标识运行的具体位置,如果你的index里面有很多方法,都可以右键添加到右边的MAP视图中,根据自己的喜好来调整数量和层次。
具体如何操作赶紧亲自体验一下吧,本来想写详细点的教程的,但是发现看视频可能更快,提供一个微软的官方视频:
本次的一些VS需要知道的功能和技巧就写到这里,下次如果有好的继续分享。