“csproj文件究竟是做什么用的”

“csproj文件究竟是做什么用的”,第1张

csproj文件大家应该不会陌生,那就是C#项目文件的扩展名,它是“C Sharp Project”的缩写。那么它究竟是给谁用的呢?那是给开发工具用的,例如我们在熟悉不过的Visual Studio,以及大家可以没有接触过,但是应该都听说过的MSBuild.exe。Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及 *** 作,MSBuild也会根据csproj文件来得知编译这个项目需要有哪些依赖,默认输出路径,Pre-Build和Post-Build需要哪些 *** 作等等。Visual Studio和MSBuild都是开发工具,这就是csproj存在的唯一意义:为“开发环境”提供信息。而到了运行环境中,根本不会有人( *** 作系统?)关心所谓的csproj文件——也就是“程序是哪里来的”。如果是个可执行程序, *** 作系统需要的只是exe,dll,甚至是配置文件或资源文件,而并非在开发中举足轻重的csproj,sln,dbproj等文件。而像IIS这样的运行环境,更加不会去关注csproj的影子:“csproj是什么?”IIS轻蔑地说,“我只听web.config的说法”。在运行环境中,csproj的辉煌不在——这是自然,你有办法向我们的IIS证明它使用的dll在开发期是由csproj,sln等文件来“统领”的吗?现在说到之前提到的“pdb文件需要放在Debug目录下才有效果”,其实不然。Debug目录只是VS的模板所“默认存在”的编译规则所生成的目录而已,我们在调试时使用pdb文件完全可以由VS指定高迹pdb文件存在的目录——甚至我们根本不需要VS也能使用pdb文件。说到了“模板”,这其实又是“开发环境”的概念。我们在VS中选择New Item或New Project时,可以在谈出窗口的左边找到模板的分类,而又边则是一堆可用的模板。这些模板是哪来的呢?自然是人为生成给VS用的,您不妨看看自己My Documents\Visual Studio 2008\Templates目录下是否存在一些zip文件,那就是存放“My Templates”的压缩包,感兴趣的朋友可以学习一下如何建立一个模板。而在“运行环境”下,更不会知道开发中用了什么模板。不知您是否提过这样的问题:“为什么Web Site中无法使用ASP.NET AJAX,而Web Application就可以?”现在您应该已经知道了,运行时期的问题和Web Site、Web Application与否没有任何关系。那么是如何产生这个问题的呢?看看您的Web.config?看看页面上提示了什么信息?用Fiddler看看请求的输出是什么?其实在很多时候“排错”并没有什么妙法,唯“仔细”二字。而且事实上,“模板”在开发环境中的“地位”比csproj文件都要低,因为只要通过模板创建好内容之后,就无法说明结果和自己有什么联系了。例如我们使用模板创建一个AjaxControlToolkit的Extender,其中会生成一个.cs,一个.designer.cs和一个js文件——呵呵,谁还能证明这三个文件不是我们手动创建的呢?这就是“开发环境”,一切都是为了开发效率的提高,一切都是为了能够最终产生一个可执行的二进制文饥禅件。而在开发环境的最后一个成员“编译器”工作完成之后,所有开发工具便默默地退居戚肢并二线。

为了在 NET 下能够编译成功 我写了一个文件 Patch cs 定义了System Runtime CompilerServices ExtensionAttribute 类型 这样就可以在 下使用lambda表达式和扩展方法了 同时 添加了几个用到的System Core dll引入的Action类型

namespace System Runtime CompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<T T >(T t T t )

}

然而 要在 NET 下编译 因为类型已经存在 必须注释掉Patch cs 很麻烦 于是想通过条件编译来解决 即

#if NET

namespace System Runtime CompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<T T >(T t T t )

}

#endif

问题是 net 里没有定义和 net版本有关的指示符 怎么办呢?自己动手 丰衣足食 使用Build Events在编译之前自动侦测出项目所使用的 net版本 定义出我们想要的指示符

在 C#模板编程( ) 编写C#预处理器运侍 让模板来的再自然一点一文中 写了一个程序 C *** acro exe 来实现C#下的模板机制 本文在C *** acro exe 的基础上 增加侦测项目所引用的 net 版本的功能

原理 查找项目目录下的 csproj 文件 解析它 找到节点TargetFrameworkVersion 判断 net版本 然后生成一个C *** acro_Template cs文件 在里面 #define 版本指示符 例如 对 Net 项目 生成的 C *** acro_Template cs 文件内容为

#define NET

修改后C *** acro的代码可在 //github /xiaotie/GebCommon上下载(目前只处理了 net 和 如需要针对其它版本 可自行修改代码) 有了 C *** acro 一切就好办了

第一步袜族 把 C *** acro exe 放在Path路径下

第二步 打开需要条件编译的项目 添加 Pre build 事件 C *** acro exe $(ProjectDir)

第三步 编辑源文件 如 Patch cs 文件修改为

#region include C *** acro_Template cs

#endregion

#if NET

namespace System Runtime CompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<T T >(T t T t )

}

#endif

 告悄弊 #region include 是我引入的 C *** acro 宏语法 详见 C#模板编程( ) 编写C#预处理器 让模板来的再自然一点 一文 点击编译 系统会生成一个 Patch_C *** acro cs 文件 内容如下

#define NET

#if NET

namespace System Runtime CompilerServices

{

public class ExtensionAttribute : Attribute { }

}

namespace System

{

public delegate void Action()

public delegate void Action<T T >(T t T t )

}

#endif

第四步 把生成的 Patch_C *** acro cs 添加到项目中来

lishixinzhi/Article/program/net/201311/16137

在 VC#.net 开发环境中建立项目时,会产生 .csproj 文件族亮,这是C#的工程文模早件,其中记录了与工程有关的相旦穗雀关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12256683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存