Hero Circle Shape
Hero Moon Shape
Hero Right Shape
bitpie钱包安卓版|csproj用什么打开

bitpie钱包安卓版|csproj用什么打开

  • 作者: bitpie钱包安卓版
  • 2024-03-10 20:24:23

如何运行 C# 程序 - Visual Studio (Windows) | Microsoft Learn

如何运行 C# 程序 - Visual Studio (Windows) | Microsoft Learn

跳转至主内容

此浏览器不再受支持。

请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。

下载 Microsoft Edge

有关 Internet Explorer 和 Microsoft Edge 的详细信息

目录

退出焦点模式

使用英语阅读

保存

目录

使用英语阅读

保存

打印

Twitter

LinkedIn

Facebook

电子邮件

目录

在 Visual Studio 中运行 C# 程序

项目

03/16/2023

7 个参与者

反馈

本文内容

如何运行程序取决于你从什么开始执行、程序的类型,以及你是否想在调试器下运行。 最简单的是在 Visual Studio 中生成并运行一个打开的项目,在这种情况下,可执行以下操作:

按 F5,从 Visual Studio 菜单中选择“调试”>“开始执行(调试)”,或在 Visual Studio 工具栏上选择绿色的“开始”箭头和项目名称 。

你也可以按 Ctrl+F5,或从 Visual Studio 菜单中选择“调试”>“开始执行(不调试)”,直接运行而不调试 。

从项目开始

你可以运行 C# 项目或 .csproj 文件(如果是可运行的程序)。 如果项目包含带有 Main 方法的 C# 文件,并且其输出为可执行文件(.exe 文件),则很可能会在项目成功生成后运行该文件。 较新版本的 C# 不需要 Main 方法;相反,程序执行从顶级语句开始。 请参阅不含 Main 方法的程序。

如果你的程序代码已在 Visual Studio 项目中,请打开该项目。 你可以执行以下操作来打开项目:双击或点击 Windows 文件资源管理器中的 .csproj 文件;或者在 Visual Studio 中选择“打开项目”,浏览以找到 .csproj 文件,然后选择该文件。

在 Visual Studio 中加载项目后,如果 Visual Studio 解决方案包含多个项目,请确保将带有 Main 方法的项目设置为启动项目。 要设置启动项目,请右键单击“解决方案资源管理器”中的项目名称或节点,然后从上下文菜单中选择“设置为启动项目” 。

要运行程序,请按 Ctrl+F5,从顶部菜单中选择“调试”>“开始执行(不调试)”,或选择绿色的“开始”按钮 。

Visual Studio 会尝试生成并运行你的项目。 在 Visual Studio 屏幕的底部,生成输出显示在“输出”窗口中,生成错误显示在“错误列表”窗口中 。

如果生成成功,应用会以适合项目类型的方式运行。 控制台应用在终端窗口中运行,Windows 桌面应用在新的桌面窗口中启动,Web 应用在由 IIS Express 承载的浏览器中运行。

从代码开始

如果是从代码清单、代码文件或少量文件开始,请首先确保该代码来自受信任的源,并且是可运行的程序。 具有 Main 方法的任何应用都可能是可运行的程序,但对于当前版本的 C#,不含 Main 方法但具有顶级语句的程序也可以运行。 你可以使用“控制台应用程序”模板创建一个项目,以便在 Visual Studio 中使用该应用。

单个文件的代码列表

启动 Visual Studio,并打开一个空的 C# 控制台应用程序项目。

将项目 .cs 文件中的所有代码替换为代码清单或文件的内容。

将项目 .cs 文件重命名为与你的代码文件名一致。

磁盘上有多个代码清单或文件

启动 Visual Studio,并创建适当类型的新项目。 如果不确定,请使用 C#“控制台应用程序”。

在新项目中,将项目代码文件中的所有代码替换为第一个代码清单或文件的内容。

重命名项目代码文件,使其与你的代码文件名一致。

对于其余的每个代码文件:

右键单击“解决方案资源管理器”中的项目节点,然后选择“添加”>“现有项”,或选择该项目,然后按 Shift+Alt+A 。

浏览到并选择要导入到项目中的代码文件。

文件夹中有多个文件

如果文件夹中有多个文件,请先查找项目或解决方案文件。 Visual Studio 创建的程序具有项目和解决方案文件。 在 Windows 文件资源管理器中,查找扩展名为 .csproj 或 .sln 的文件 。 双击 .csproj 文件,在 Visual Studio 中打开它。 请参阅从 Visual Studio 解决方案或项目开始。

如果代码来自其他开发环境,则没有项目文件。 在 Visual Studio 中选择“打开”>“文件夹”,打开该文件夹 。 请参阅开发代码而无需创建项目或解决方案。

从 GitHub 或 Azure DevOps 存储库开始

如果要运行的代码位于 GitHub 或 Azure DevOps 存储库中,则可以使用 Visual Studio 直接从存储库打开项目。 请参阅打开存储库中的项目。

运行程序

要开始生成程序,请按 Visual Studio 工具栏上的绿色“开始”按钮,或者按 F5 或 Ctrl+F5 。 使用“开始”按钮或 F5 在调试器下运行程序 。

Visual Studio 会尝试在你的项目中生成并运行代码。 如果生成不成功,请参阅以下部分,了解有关如何成功生成项目的一些建议。

疑难解答

你的代码可能有错误。 或者代码可能是正确的,但它可能依赖于缺少的程序集或 NuGet 包,或者针对其他版本的 .NET。 在这些情况下,可以轻松地修复生成。

添加引用

要正确生成,代码必须正确,并具有对库或其他依赖项的正确引用。 代码中的红色波浪下划线或错误列表中的条目表明存在错误,即使在编译和运行程序之前也是如此。 如果错误与未解析的名称相关,则可能需要添加引用和/或 using 指令。 如果代码引用了任何缺失的程序集或 NuGet 包,则需要将这些引用添加到项目。

Visual Studio 会尝试帮助你识别缺少的引用。 如果名称未解析,编辑器中会出现灯泡图标。 选择灯泡,可以看到有关如何修复此问题的一些建议。 解决方法可能是:

添加 using 指令。

添加对程序集的引用。

安装 NuGet 包。

添加 using 指令

下面是缺少的 using 指令的示例。 你可以将 using System; 添加到代码文件的开头,以解析无法解析的名称 Console:

较新版本的 C# 支持对一些常用命名空间使用隐式 using 指令,因此,如果在创建项目时选择了该选项,则不需要它们。

添加程序集引用

.NET 引用可以是程序集或 NuGet 包。 在源代码中,发布者或作者通常会说明代码所需的程序集以及它所依赖的包。 要手动添加对项目的引用,请右键单击“解决方案资源管理器”中的“引用”节点,然后选择“添加引用” 。 在“引用管理器”中,找到并添加所需的程序集。

你可以按照使用引用管理器添加或删除引用中的说明查找程序集并添加引用。

添加 NuGet 包

如果 Visual Studio 检测到缺少 NuGet 包,则会显示一个灯泡,并提供安装包的选项:

如果这不能解决问题,或者 Visual Studio 找不到包,请尝试联机搜索包。 请参阅在 Visual Studio 中安装和使用 NuGet 包。

使用正确版本的 .NET

由于不同版本的 .NET Framework 具有一定的后向兼容性,因此较新的框架可能会运行针对较旧的框架编写的代码,且不需要进行任何更改。 但有时需要针对特定的 .NET Framework 版本。 你可能需要安装特定版本的 .NET Framework 或 .NET Core。 请参阅修改 Visual Studio。

要更改目标 .NET Framework 版本,请参阅更改目标框架。 有关详细信息,请参阅 .NET Framework 目标错误疑难解答。

后续步骤

阅读欢迎使用 Visual Studio IDE,探索 Visual Studio 开发环境。

创建自己的第一个 C# 应用

其他资源

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

其他资源

本文内容

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv - 博客园

理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

walterlv

博客园

首页

新随笔

联系

订阅

管理

理解 C# 项目 csproj 文件格式的本质和编译流程

 

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?

本文将直接从 csproj 文件格式的本质来看以上这些问题。

阅读本文,你将:

可以通读 csproj 文件,并说出其中每一行的含义

可以手工修改 csproj 文件,以实现你希望达到的高级功能(更高级的,可以开始写个工具自动完成这样的工作了)

理解新旧 csproj 文件的差异,不至于写工具解析和修改 csproj 文件的时候出现不兼容的错误

 

csproj 里面是什么?

总览 csproj 文件

相信你一定见过传统的 csproj 文件格式。就算你几乎从来没主动去看过里面的内容,在版本管理工具中解冲突时也在里面修改过内容。

不管你是新手还是老手,一定都会觉得这么长这么复杂的文件一定不是给人类阅读的。你说的是对的!传统 csproj 文件中有大量的重复或者相似内容,只为 msbuild 和 Visual Studio 能够识别整个项目的属性和结构,以便正确编译项目。

不过,既然这篇文章的目标是理解 csproj 文件格式的本质,那我当然不会把这么复杂的文件内容直接给你去阅读。

我已经将整个文件结构进行了极度简化,然后用思维导图进行了分割。总结成了下图,如果先不关注文件的细节,是不是更容易看懂了呢?

如果你此前也阅读过我的其他博客,会发现我一直在试图推荐使用新的 csproj 格式:

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件

让一个 csproj 项目指定多个开发框架

那么新格式和旧格式究竟有哪些不同使得新的格式如此简洁?

于是,我将新的 csproj 文件结构也进行简化,用思维导图进行了分割。总结成了下图:

比较两个思维导图之后,是不是发现其实两者本是相同的格式。如果忽略我在文字颜色上做的标记,其实两者的差异几乎只在文件开头是否有一个 xml 文件标记()。我在文字颜色上的标记代表着这部分的部件是否是可选的,白色代表必须,灰色代表可选;而更接近背景色的灰色代表一般情况下都是不需要的。

我把两个思维导图放到一起方便比较:

会发现,传统格式中 xml 声明、Project 节点、Import (props)、PropertyGroup、ItemGroup、Import (targets) 都是必要的,而新格式中只有 Project 节点 和 PropertyGroup 是必要的。

是什么导致了这样的差异?在了解 csproj 文件中各个部件的作用之前,这似乎很难回答。

了解 csproj 中的各个部件的作用

xml 声明部分完全没有在此解释的必要了,为兼容性提供了方便,详见:XML - Wikipedia。

接下来,我们不会依照部件出现的顺序安排描述的顺序,而是按照关注程度排序。

PropertyGroup

PropertyGroup 是用来存放属性的地方,这与它的名字非常契合。那么里面放什么属性呢?答案是——什么都能放!

在这里写属性就像在代码中定义属性或变量一样,只要写了,就会生成一个指定名称的属性。

比如,我们写:

walterlv is a 逗比

那么,就会生成一个 Foo 属性,值为字符串 walterlv is a 逗比。至于这个属性有什么用,那就不归这里管了。

这些属性的含义完全是由外部来决定的,例如在旧的 csproj 格式中,编译过程中会使用 TargetFrameworkVersion 属性,以确定编译应该使用的 .NET Framework 目标框架的版本(是 v4.5 还是 v4.7)。在新的 csproj 格式中,编译过程会使用 TargetFrameworks 属性来决定编译应该使用的目标框架(是 net47 还是 netstandard2.0)。具体是编译过程中的哪个环节哪个组件使用了此属性,我们后面会说。

从这个角度来说,如果你没有任何地方用到了你定义的属性,那为什么还要定义它呢?是的——这只是浪费。

PropertyGroup 可以定义很多个,里面都可以同等地放属性。至于为什么会定义多个,原因无外乎两个:

为了可读性——将一组相关的属性放在一起,便于阅读和理解意图(旧的 csproj 谈不上什么可读性)

为了加条件——有的属性在 Debug 和 Release 下不一样(例如条件编译符 DefineConstants)

额外说一下,Debug 和 Release 这两个值其实是在某处一个名为 Configuration 的属性定义的,它们其实只是普通的字符串而已,没什么特殊的意义,只是有很多的 PropertyGroup 加上了 Debug Release 的判断条件才使得不同的 Configuration 具有不同的其他属性,最终表现为编译后的巨大差异。由于 Configuration 属性可以放任意字符串,所以甚至可以定义一个非 Debug 和 Release 的配置(例如用于性能专项测试)也是可以的。

ItemGroup

ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!

是不是觉得这句话跟前面的 PropertyGroup 句式一模一样?是的——就是一模一样!csproj 中的两个大头都这样不带语义,几乎可以说明 csproj 文件是不包含语义的,它能够用来做什么事情纯属由其他模块来指定;这为 csproj 文件强大的扩展性提供了格式基础。

既然什么都能放,那我们放这些吧:

walterlv is a 逗比

walterlv is a 天才

天才向左,逗比向右

逗比属性额外加成

于是我们就有 4 个类型为 Foo 的项了,至于这 4 个 Foo 项有什么作用,那就不归这里管了。

这些项的含义与 PropertyGroup 一样也是由外部来决定。具体是哪个外部,我们稍后会说。但是我们依然有一些常见的项可以先介绍介绍:

Reference 引用某个程序集

PackageReference 引用某个 NuGet 包

ProjectReference 引用某个项目

Compile 常规的 C# 编译

None 没啥特别的编译选项,就为了执行一些通用的操作(或者是只是为了在 Visual Studio 列表中能够有一个显示)

Folder 一个空的文件夹,也没啥用(不过标了这个文件夹,Visual Studio 中就能有一个文件夹的显式,即便实际上这个文件夹可能不存在)

ItemGroup 也可以放很多组,一样是为了提升可读性或者增加条件。

Import

你应该注意到在前面的思维导图中,无论是新 csproj 还是旧 csproj 文件,我都写了两个 Import 节点。其实它们本质上是完全一样的,只不过在含义上有不同。前面我们了解到 csproj 文件致力于脱离语义,所以分开两个地方写几乎只是为了可读性考虑。

那么前面那个 Import 和后面的 Import 在含义上有何区别?思维导图的括号中我已说明了含义。前面是为了导入属性(props),后面是为了导入 Targets。属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分,所以我们放到最后再说。

那么,被我们 Import 进来的那些文件是什么呢?用两种扩展名,定义属性的那一种是 .props,定义行为的那一种是 .targets。

这两种文件除了含义不同以外,内容的格式都是完全一样的——而且——就是 csproj 文件的那种格式!没错,也包含 Project、Import、PropertyGroup、ItemGroup、Targets。只不过,相比于对完整性有要求的 csproj 文件来说,这里可以省略更多的节点。由于有 Import 的存在,所以一层一层地嵌套 props 或者 targets 都是可能的。

说了这么多,让我们来看其中两个 .props 文件吧。

先看看旧格式 csproj 文件中第一行一定会 Import 的那个 Microsoft.Common.props。

true

true

true

true

true

文件太长,做了大量删减,但也可以看到文件格式与 csproj 几乎是一样的。此文件中,根据其他属性的值有条件地定义了另一些属性。

再看看另一个 MSTest 单元测试项目中被隐式 Import 进 csproj 文件中的 .props 文件。(所谓隐式地 Import,只不过是被间接地引入,在 csproj 文件中看不到这个文件名而已。至于如何间接引入,因为涉及到 Targets,所以后面一起说明。)

Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dll

PreserveNewest

False

Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.dll

PreserveNewest

False

Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.dll

PreserveNewest

False

此文件中将三个 dll 文件从 MSTest 的 NuGet 包中以链接的形式包含到项目中,并且此文件在 Visual Studio 的解决方案列表中不可见。

可以看出,引入的 props 文件可以实现几乎与 csproj 文件中一样的功能。

那么,既然 csproj 文件中可以完全实现这样的功能,为何还要单独用 props 文件来存放呢?原因显而易见了——为了在多个项目中使用,一处更新,到处生效。所以有没有觉得很好玩——如果把版本号单独放到 props 文件中,就能做到一处更新版本号,到处更新版本号啦!

Target

终于开始说 Target 了。为什么会这么期待呢?因为前面埋下的各种伏笔几乎都要在这一节点得到解释了。

一般来说,Target 节点写在 csproj 文件的末尾,但这个并不是强制的。Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。而我们实质上的编译过程便全部由这些 Targets 来完成。我们甚至可以直接说——编译过程就是靠这些 Target 的组合来完成的。

如果你希望全面了解 Targets,推荐直接阅读微软的官方文档 MSBuild Targets,而本文只会对其进行一些简单的概述。当然如果你非常感兴趣,还可以阅读我另外几篇关于 Target 使用相关的文章:

如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - 吕毅

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - 吕毅

每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - 吕毅

如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference) - 吕毅

不过,为了简单地理解 Target,我依然需要借用官方文档的例子作为开头。

这份代码定义了一个名为 Construct 的 Target,这是随意取的一个名字,并不重要——但是编译过程中会执行这个 Target。在这个 Target 内部,使用了一个 msbuild 自带的名为 Csc 的 Task。这里我们再次引入了一个新的概念 Task。而 Task 是 Target 内部真正完成逻辑性任务的核心;或者说 Target 其实只是一种容器,本身并不包含编译逻辑,但它的内部可以存放 Task 来实现编译逻辑。一个 Target 内可以放多个 Task,不止如此,还能放 PropertyGroup 和 ItemGroup,不过这是仅在编译期生效的属性和项了。

@(Compile) 是 ItemGroup 中所有 Compile 类型节点的集合。还记得我们在 ItemGroup 小节时说到每一种 Item 的含义由外部定义吗?是的,就是在这里定义的!本身并没有什么含义,但它们作为参数传入到了具体的 Task 之后便有了此 Task 指定的含义。

于是 的含义便是调用 msbuild 内置的 C# 编译器编译所有 Compile 类型的项。

如果后面定义了一个跟此名称一样的 Target,那么后一个 Target 就会覆盖前一个 Target,导致前一个 Target 失效。

再次回到传统的 csproj 文件上来,每一个传统格式的 csproj 都有这样一行:

而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。只要引入了这个 .targets 文件,便能使用 msbuild 自带的编译任务完成绝大多数项目的编译。你可以自己去查看此文件中的内容,相信有以上 Target 的简单介绍,应该能大致理解其完成编译的流程。这是我的地址:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.CSharp.targets。

Project

所有的 csproj 文件都是以 Project 节点为根节点。既然是根节点为何我会在最后才说 Project 呢?因为这可是一个大悬念啊!本文一开始就描述了新旧两款 csproj 文件格式的差异,你也能从我的多篇博客中感受到新格式带来的各种好处;而简洁便是新格式中最大的好处之一。它是怎么做到简洁的呢?

就靠 Project 节点了。

注意到新格式中 Project 节点有 Sdk 属性吗?因为有此属性的存在,csproj 文件才能如此简洁。因为——所谓 Sdk,其实是一大波 .targets 文件的集合。它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。

如果你希望看看 Microsoft.NET.Sdk 都引入了哪些文件,可以去本机安装的 msbuild 或 dotnet 的目录下查看。当我使用 msbuild 编译时,我的地址:C:\Program Files\dotnet\sdk\2.1.200\Sdks\Microsoft.NET.Sdk\build\。比如你可以从此文件夹里的 Microsoft.NET.GenerateAssemblyInfo.targets 文件中发现 AssemblyInfo.cs 文件是如何自动生成及生效的。

编译器是如何将这些零散的部件组织起来的?

这里说的编译器几乎只指 msbuild 和 Roslyn,前者基于 .NET Framework,后者基于 .NET Core。不过,它们在处理我们的项目文件时的行为大多是一致的——至少对于通常项目来说如此。

我们前一部分介绍每个部件的时候,已经简单说了其组织方式,这里我们进行一个回顾和总结。

当 Visual Studio 打开项目时,它会解析里面所有的 Import 节点,确认应该引入的 .props 和 .targets 文件都引入了。随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。——这只是 Visual Studio 做的事情。

在编译时,msbuild 或 Roslyn 还会重新做一遍上面的事情——毕竟这两个才是真正的编译器,可不是 Visual Studio 的一部分啊。随后,执行编译过程。它们会按照 Target 指定的先后顺序来安排不同 Target 的执行,当执行完所有的 Target,便完成了编译过程。

新旧 csproj 在编译过程上有什么差异?

相信读完前面两个部分之后,你应该已经了解到在格式本身上,新旧格式之间其实并没有什么差异。或者更严格来说,差异只有一条——新格式在 Project 上指定了 Sdk。真正造成新旧格式在行为上的差别来源于默认为我们项目 Import 进来的那些 .props 和 .targets 不同。新格式通过 Microsoft.NET.Sdk 为我们导入了更现代化的 .props 和 .targets,而旧格式需要考虑到兼容性压力,只能引入旧的那些 .targets。

新的 Microsoft.NET.Sdk 以不兼容的方式支持了各种新属性,例如新的 TargetFrameworks 代替旧的 TargetFrameworkVersion,使得我们的 C# 项目可以脱离 .NET Framework,引入其他各种各样的目标框架,例如 netstandard2.0、net472、uap10.0 等(可以参考 从以前的项目格式迁移到 VS2017 新项目格式 - 林德熙)了解可以使用那些目标框架。

新的 Microsoft.NET.Sdk 以不兼容的方式原生支持了 NuGet 包管理。也就是说我们可以在不修改 csproj 的情况之下通过 NuGet 包来扩展 csproj 的功能。而旧的格式需要在 csproj 文件的末尾添加如下代码才可以获得其中一个 NuGet 包功能的支持:

This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.

不过好在 NuGet 4.x 以上版本在安装 NuGet 包时自动为我们在 csproj 中插入了以上代码。

更多资料

如果你在阅读本文时还有更多问题,可以阅读我和朋友的其他相关博客,也可以随时在下方向我留言。如果没有特别原因,我都是在一天之内进行回复。

项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量了) - 吕毅

让一个 csproj 项目指定多个开发框架 - 吕毅

从以前的项目格式迁移到 VS2017 新项目格式 - 林德熙

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 - 吕毅

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference - 吕毅

posted @

2018-05-19 07:58 

walterlv 

阅读(9601) 

评论(1) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 walterlv

Powered by .NET 8.0 on Kubernetes

© 2014-2018 walterlv, all rights reserved.

Designed by: walterlv

理解 C# 项目 csproj 文件格式的本质和编译流程_.csproj-CSDN博客

>

理解 C# 项目 csproj 文件格式的本质和编译流程_.csproj-CSDN博客

理解 C# 项目 csproj 文件格式的本质和编译流程

最新推荐文章于 2024-03-07 14:53:15 发布

我心依旧

最新推荐文章于 2024-03-07 14:53:15 发布

阅读量928

收藏

5

点赞数

2

文章标签:

c#

wpf

开发语言

原文链接:http://www.fogsvc.com/3024.html

版权

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?

本文将直接从 csproj 文件格式的本质来看以上这些问题。

阅读本文,你将:

可以通读 csproj 文件,并说出其中每一行的含义

可以手工修改 csproj 文件,以实现你希望达到的高级功能(更高级的,可以开始写个工具自动完成这样的工作了)

理解新旧 csproj 文件的差异,不至于写工具解析和修改 csproj 文件的时候出现不兼容的错误

csproj 里面是什么?

一、总览 csproj 文件

相信你一定见过传统的 csproj 文件格式。就算你几乎从来没主动去看过里面的内容,在版本管理工具中解冲突时也在里面修改过内容。

不管你是新手还是老手,一定都会觉得这么长这么复杂的文件一定不是给人类阅读的。你说的是对的!传统 csproj 文件中有大量的重复或者相似内容,只为 msbuild 和 Visual Studio 能够识别整个项目的属性和结构,以便正确编译项目。

不过,既然这篇文章的目标是理解 csproj 文件格式的本质,那我当然不会把这么复杂的文件内容直接给你去阅读。

我已经将整个文件结构进行了极度简化,然后用思维导图进行了分割。总结成了下图,如果先不关注文件的细节,是不是更容易看懂了呢?

如果你此前也阅读过我的其他博客,会发现我一直在试图推荐使用新的 csproj 格式:

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件

让一个 csproj 项目指定多个开发框架

那么新格式和旧格式究竟有哪些不同使得新的格式如此简洁?

于是,我将新的 csproj 文件结构也进行简化,用思维导图进行了分割。总结成了下图:

比较两个思维导图之后,是不是发现其实两者本是相同的格式。如果忽略我在文字颜色上做的标记,其实两者的差异几乎只在文件开头是否有一个 xml 文件标记()。我在文字颜色上的标记代表着这部分的部件是否是可选的,白色代表必须,灰色代表可选;而更接近背景色的灰色代表一般情况下都是不需要的。

我把两个思维导图放到一起方便比较:

会发现,传统格式中 xml 声明、Project 节点、Import (props)、PropertyGroup、ItemGroup、Import (targets) 都是必要的,而新格式中只有 Project 节点 和 PropertyGroup 是必要的。

是什么导致了这样的差异?在了解 csproj 文件中各个部件的作用之前,这似乎很难回答。

二、了解 csproj 中的各个部件的作用

xml 声明部分完全没有在此解释的必要了,为兼容性提供了方便,详见:XML – Wikipedia。

接下来,我们不会依照部件出现的顺序安排描述的顺序,而是按照关注程度排序。

1.PropertyGroup

PropertyGroup 是用来存放属性的地方,这与它的名字非常契合。那么里面放什么属性呢?答案是——什么都能放!

在这里写属性就像在代码中定义属性或变量一样,只要写了,就会生成一个指定名称的属性。

比如,我们写:

walterlv is a 逗比

那么,就会生成一个 Foo 属性,值为字符串 walterlv is a 逗比。至于这个属性有什么用,那就不归这里管了。

这些属性的含义完全是由外部来决定的,例如在旧的 csproj 格式中,编译过程中会使用 TargetFrameworkVersion 属性,以确定编译应该使用的 .NET Framework 目标框架的版本(是 v4.5 还是 v4.7)。在新的 csproj 格式中,编译过程会使用 TargetFrameworks 属性来决定编译应该使用的目标框架(是 net47 还是 netstandard2.0)。具体是编译过程中的哪个环节哪个组件使用了此属性,我们后面会说。

从这个角度来说,如果你没有任何地方用到了你定义的属性,那为什么还要定义它呢?是的——这只是浪费。

PropertyGroup 可以定义很多个,里面都可以同等地放属性。至于为什么会定义多个,原因无外乎两个:

为了可读性——将一组相关的属性放在一起,便于阅读和理解意图(旧的 csproj 谈不上什么可读性)

为了加条件——有的属性在 Debug 和 Release 下不一样(例如条件编译符 DefineConstants)

额外说一下,Debug 和 Release 这两个值其实是在某处一个名为 Configuration 的属性定义的,它们其实只是普通的字符串而已,没什么特殊的意义,只是有很多的 PropertyGroup 加上了 Debug Release 的判断条件才使得不同的 Configuration 具有不同的其他属性,最终表现为编译后的巨大差异。由于 Configuration 属性可以放任意字符串,所以甚至可以定义一个非 Debug 和 Release 的配置(例如用于性能专项测试)也是可以的。

2.ItemGroup

ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!

是不是觉得这句话跟前面的 PropertyGroup 句式一模一样?是的——就是一模一样!csproj 中的两个大头都这样不带语义,几乎可以说明 csproj 文件是不包含语义的,它能够用来做什么事情纯属由其他模块来指定;这为 csproj 文件强大的扩展性提供了格式基础。

既然什么都能放,那我们放这些吧:

walterlv is a 逗比walterlv is a 天才天才向左,逗比向右逗比属性额外加成

于是我们就有 4 个类型为 Foo 的项了,至于这 4 个 Foo 项有什么作用,那就不归这里管了。

这些项的含义与 PropertyGroup 一样也是由外部来决定。具体是哪个外部,我们稍后会说。但是我们依然有一些常见的项可以先介绍介绍:

Reference 引用某个程序集PackageReference 引用某个 NuGet 包ProjectReference 引用某个项目Compile 常规的 C# 编译None 没啥特别的编译选项,就为了执行一些通用的操作(或者是只是为了在 Visual Studio 列表中能够有一个显示)Folder 一个空的文件夹,也没啥用(不过标了这个文件夹,Visual Studio 中就能有一个文件夹的显式,即便实际上这个文件夹可能不存在)

ItemGroup 也可以放很多个,一样是为了提升可读性或者增加条件。

3.Import

你应该注意到在前面的思维导图中,无论是新 csproj 还是旧 csproj 文件,我都写了两个 Import 节点。其实它们本质上是完全一样的,只不过在含义上有不同。前面我们了解到 csproj 文件致力于脱离语义,所以分开两个地方写几乎只是为了可读性考虑。

那么前面那个 Import 和后面的 Import 在含义上有何区别?思维导图的括号中我已说明了含义。前面是为了导入属性(props),后面是为了导入 Targets。属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分,所以我们放到最后再说。

那么,被我们 Import 进来的那些文件是什么呢?用两种扩展名,定义属性的那一种是 .props,定义行为的那一种是 .targets。

这两种文件除了含义不同以外,内容的格式都是完全一样的——而且——就是 csproj 文件的那种格式!没错,也包含 Project、Import、PropertyGroup、ItemGroup、Targets。只不过,相比于对完整性有要求的 csproj 文件来说,这里可以省略更多的节点。由于有 Import 的存在,所以一层一层地嵌套 props 或者 targets 都是可能的。

说了这么多,让我们来看其中两个 .props 文件吧。

先看看旧格式 csproj 文件中第一行一定会 Import 的那个 Microsoft.Common.props。

truetruetruetruetrue

文件太长,做了大量删减,但也可以看到文件格式与 csproj 几乎是一样的。此文件中,根据其他属性的值有条件地定义了另一些属性。

再看看另一个 MSTest 单元测试项目中被隐式 Import 进 csproj 文件中的 .props 文件。(所谓隐式地 Import,只不过是被间接地引入,在 csproj 文件中看不到这个文件名而已。至于如何间接引入,因为涉及到 Targets,所以后面一起说明。)

Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dllPreserveNewestFalseMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.dllPreserveNewestFalseMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.dllPreserveNewestFalse

此文件中将三个 dll 文件从 MSTest 的 NuGet 包中以链接的形式包含到项目中,并且此文件在 Visual Studio 的解决方案列表中不可见。

可以看出,引入的 props 文件可以实现几乎与 csproj 文件中一样的功能。

那么,既然 csproj 文件中可以完全实现这样的功能,为何还要单独用 props 文件来存放呢?原因显而易见了——为了在多个项目中使用,一处更新,到处生效。所以有没有觉得很好玩——如果把版本号单独放到 props 文件中,就能做到一处更新版本号,到处更新版本号啦!

4.Target

终于开始说 Target 了。为什么会这么期待呢?因为前面埋下的各种伏笔几乎都要在这一节点得到解释了。

一般来说,Target 节点写在 csproj 文件的末尾,但这个并不是强制的。Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。而我们实质上的编译过程便全部由这些 Targets 来完成。我们甚至可以直接说——编译过程就是靠这些 Target 的组合来完成的。

如果你希望全面了解 Targets,推荐直接阅读微软的官方文档 MSBuild Targets,而本文只会对其进行一些简单的概述(我即将用另一篇博客来详细讲解,不然这篇就太长了)。

不过,为了简单地理解 Target,我依然需要借用官方文档的例子作为开头。

这份代码定义了一个名为 Construct 的 Target,这是随意取的一个名字,并不重要——但是编译过程中会执行这个 Target。在这个 Target 内部,使用了一个 msbuild 自带的名为 Csc 的 Task。这里我们再次引入了一个新的概念 Task。而 Task 是 Target内部真正完成逻辑性任务的核心;或者说 Target 其实只是一种容器,本身并不包含编译逻辑,但它的内部可以存放 Task 来实现编译逻辑。一个 Target 内可以放多个 Task,不止如此,还能放 PropertyGroup 和 ItemGroup,不过这是仅在编译期生效的属性和项了。

@(Compile) 是 ItemGroup 中所有 Compile 类型节点的集合。还记得我们在 ItemGroup 小节时说到每一种 Item 的含义由外部定义吗?是的,就是在这里定义的!本身并没有什么含义,但它们作为参数传入到了具体的 Task 之后便有了此 Task 指定的含义。

于是  的含义便是调用 msbuild 内置的 C# 编译器编译所有 Compile 类型的项。

如果后面定义了一个跟此名称一样的 Target,那么后一个 Target 就会覆盖前一个 Target,导致前一个 Target 失效。

再次回到传统的 csproj 文件上来,每一个传统格式的 csproj 都有这样一行:

而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。只要引入了这个 .targets 文件,便能使用 msbuild 自带的编译任务完成绝大多数项目的编译。你可以自己去查看此文件中的内容,相信有以上 Target 的简单介绍,应该能大致理解其完成编译的流程。这是我的地址:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.CSharp.targets。

5.Project

所有的 csproj 文件都是以 Project 节点为根节点。既然是根节点为何我会在最后才说 Project 呢?因为这可是一个大悬念啊!本文一开始就描述了新旧两款 csproj 文件格式的差异,你也能从我的多篇博客中感受到新格式带来的各种好处;而简洁便是新格式中最大的好处之一。它是怎么做到简洁的呢?

就靠 Project 节点了。

注意到新格式中 Project 节点有 Sdk 属性吗?因为有此属性的存在,csproj 文件才能如此简洁。因为——所谓 Sdk,其实是一大波 .targets 文件的集合。它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。

如果你希望看看 Microsoft.NET.Sdk 都引入了哪些文件,可以去本机安装的 msbuild 或 dotnet 的目录下查看。当我使用 msbuild 编译时,我的地址:C:\Program Files\dotnet\sdk\2.1.200\Sdks\Microsoft.NET.Sdk\build\。比如你可以从此文件夹里的 Microsoft.NET.GenerateAssemblyInfo.targets 文件中发现 AssemblyInfo.cs 文件是如何自动生成及生效的。

编译器是如何将这些零散的部件组织起来的?

这里说的编译器几乎只指 msbuild 和 Roslyn,前者基于 .NET Framework,后者基于 .NET Core。不过,它们在处理我们的项目文件时的行为大多是一致的——至少对于通常项目来说如此。

我们前一部分介绍每个部件的时候,已经简单说了其组织方式,这里我们进行一个回顾和总结。

当 Visual Studio 打开项目时,它会解析里面所有的 Import 节点,确认应该引入的 .props 和 .targets 文件都引入了。随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。——这只是 Visual Studio 做的事情。

在编译时,msbuild 或 Roslyn 还会重新做一遍上面的事情——毕竟这两个才是真正的编译器,可不是 Visual Studio 的一部分啊。随后,执行编译过程。它们会按照 Target 指定的先后顺序来安排不同 Target 的执行,当执行完所有的 Target,便完成了编译过程。

新旧 csproj 在编译过程上有什么差异?

相信读完前面两个部分之后,你应该已经了解到在格式本身上,新旧格式之间其实并没有什么差异。或者更严格来说,差异只有一条——新格式在 Project 上指定了 Sdk。真正造成新旧格式在行为上的差别来源于默认为我们项目 Import 进来的那些 .props 和 .targets 不同。新格式通过 Microsoft.NET.Sdk 为我们导入了更现代化的 .props 和 .targets,而旧格式需要考虑到兼容性压力,只能引入旧的那些 .targets。

新的 Microsoft.NET.Sdk 以不兼容的方式支持了各种新属性,例如新的 TargetFrameworks 代替旧的 TargetFrameworkVersion,使得我们的 C# 项目可以脱离 .NET Framework,引入其他各种各样的目标框架,例如 netstandard2.0、net472、uap10.0 等(可以参考 从以前的项目格式迁移到 VS2017 新项目格式 – 林德熙)了解可以使用那些目标框架。

新的 Microsoft.NET.Sdk 以不兼容的方式原生支持了 NuGet 包管理。也就是说我们可以在不修改 csproj 的情况之下通过 NuGet 包来扩展 csproj 的功能。而旧的格式需要在 csproj 文件的末尾添加如下代码才可以获得其中一个 NuGet 包功能的支持:

不过好在 NuGet 4.x 以上版本在安装 NuGet 包时自动为我们在 csproj 中插入了以上代码。

优惠劵

我心依旧

关注

关注

2

点赞

5

收藏

觉得还不错?

一键收藏

知道了

0

评论

理解 C# 项目 csproj 文件格式的本质和编译流程

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?本文将直接从 csproj 文件格式的本质来看以上这些问题。

复制链接

扫一扫

获取C#项目包含的所有程序文件的源代码

12-12

获取C#项目包含的所有程序文件的源代码,包含项目文件SLN的解析,解决方案CSPROJ的解析,XML命名空间的适配。

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

weixin_30413739的博客

08-17

572

csproj文件大家应该不会陌生,那就是C#项目文件的扩展名,它是“C Sharp Project”的缩写。 那么它究竟是给谁用的呢?那是给开发工具用的,例如我们在熟悉不过的Visual Studio,以及大家可以没有接触过,但是应该都听说过的MSBuild.exe。Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作,MSBuild也会...

参与评论

您还未登录,请先

登录

后发表或查看评论

csproj内容解析

sgmcumt的博客

10-10

6980

文章目录指定目标框架指定多个目标框架新增其它项目属性项目引用普通NuGet包引用添加引用NuGet包的条件托管程序集引用添加COM组件引用本机文件引用项目引用编译嵌入式资源None输入其它

使用C#很长时间都没太关注,最近查看一些开源软件,有时候需要在csproj更改项目的配置信息,不得不熟悉里面的配置内容。

如果只是想了解csproj文件的配置项的含义,不太关注配置内容的细节,可以查看理解 C#...

vs2019 .NET CORE csproj 文件编辑点

pehao的博客

10-19

1297

1. 引用框架,Microsoft.NETCore.App,手动打开xxx.csproj文件,添加以下节点

2.输出时,不输出\bin\debug\netcore3.1目录

netc

MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata

aijianxie8808的博客

04-22

318

在软件项目不断的进展中,MSBuild 脚本可能几个月都不会被修改,因为通常编译和发布的目录是不经常变化的。

但,一旦某天你需要修改了,看到那一堆 $(Something)、 @(Something)、%(Something) 是相当的头大,不得不搜索 MSDN 才能找到合理的用法。

每次看到下面这样的语法,我都感觉,有必要把语法设计成这样吗?

1

.csproj 文件

热门推荐

m0_37805255的博客

08-28

1万+

.csproj 文件

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

【作用】

.csproj究竟是做什么用的?它是给开发工具用的,例如我们再熟悉不过的Visual Studio,以...

csproj文件常用设置及C#注释常用写法

博客

06-29

774

csproj文件常用设置及C#注释常用写法

修改.csproj文件_从.NET Core将现有.NET项目文件升级为精益的新CSPROJ格式

10-13

1055

修改.csproj文件If you've looked at csproj (C# (csharp) projects) in the past in a text editor you probably looked away quickly. They are effectively MSBuild files that orchestrate the build process. Phras...

【CSharp】关于xxx.csproj文件的理解

jn10010537的博客

07-21

593

Visual Studio会根据csproj里的内容来定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作。.csproj文件记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。在.NET框架的开发环境中建立项目时,会产生.csproj文件,这是C#的项目工程文件。csproj的全称是C Sharp Project的缩写,是C#项目文件的扩展名。上面的iRayBase.csproj 文件后缀是 .csproj。在示例代码里,遇到.csproj 文件。

C#动态执行与编译

09-14

C#动态执行与编译,实现了动态编译并执行指定类(代码)的函数的方法。

拖放打开文件,C#获取文件目录路径

03-16

摘要:C#源码,文件操作,获取路径,拖放文件 拖放打开文件,C#获取文件的目录或路径信息,只需拖动文件到主窗体中,即可获取到所选文件所在的目录路径,弹出窗口告诉你。这种拖放打开文件的方法也是Windows系统所特有...

使用.NET命令行编译器编译项目(如ASP.NET、C#等)

01-21

源程序最好有.csproj或.vbproj文件,没有的话,要花些时间调试 下面我以VB.NET做示例讲解一下:   从proj我们可以获取以下有用信息   Settings小节中有很多配置选项,对应一些编译器选项 小节中是项目的引用,第3...

C#二维码识别和生成的源码,VS2017直接编译

03-16

Zxing库的源码,C#语言 ,VS编译器,.net4.0以上框架支持,包含二维码生成和识别模块,支持常规一维条形码,QR、DM等二维码,进行了识别优化,测试成功率99%。

1768.交替合并字符串

明确的爱,真诚的喜欢,直接的厌恶,站在太阳底下的坦荡,被坚定的选择。

03-07

152

给你两个字符串 word1 和 word2。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。使用两个指针i和j,初始时分别指向两个字符串的首个位置。如果i没有超出word1的范围,就将word1[i]加入答案,并且将i移动一个位置;如果j没有超出word2的范围,就将word2[j]加入答案,并且将j移动一个位置。当i和j都超出对应的范围后,结束循环并返回答案即可。返回 合并后的字符串。

C#通过配置文件动态修改web.config内容

lxyforever5的博客

03-07

338

Web.setting.config内容,存放一些配置信息,内容具体情况具体设置。Web.aaa.config内容,存放连接数据库的信息。1. Web.config配置文件内的处理。3.进行动态修改,具体情况具体操作。

[C#]winform部署yolov9的onnx模型

FL1623863129的博客

03-04

930

C#实现全网yolov7目前最快winform目标检测,使用C#部署openvino-yolov5s模型,使用C++部署yolov8的onnx和bytetrack实现目标追踪,用opencv和onnxruntime去部署yolov5-7-8,使用C#调用libotrch-yolov5模型实现全网最快winform目标检测。这不仅展示了YOLO系列模型在实际应用中的价值,也体现了C# WinForms在构建用户界面和集成深度学习模型方面的优势。在当今的计算机视觉领域,目标检测是不可或缺的一项技术。

C# 不可识别数据库格式问题

hspx668的博客

03-04

898

可以尝试使用数据库管理工具(比如Access自带的修复工具)对数据库文件进行修复,或者尝试连接其他已知可用的数据库文件进行测试。5. 使用正确的连接字符串:在连接数据库时,需要使用正确的连接字符串来指定数据库文件的位置、类型和其他必要信息。总之,当遇到C#中不可识别的数据库格式错误时,重要的是要仔细检查并排除各种可能导致问题的原因,并采取适当的措施来解决问题,以确保应用程序能够顺利地连接和操作数据库。总之,当遇到数据库格式不可识别的错误时,首先需要仔细检查错误消息,确定出现错误的具体位置和原因。

ManualResetEvent 在线程中的使用C#

最新发布

weixin_40314351的博客

03-07

364

ManualResetEvent 用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。

c#如何生成csproj文件

07-28

生成一个 C# 的 csproj 文件可以通过以下步骤完成:

1. 打开 Visual Studio 或者你喜欢的代码编辑器。

2. 创建一个新的 C# 项目或者打开一个已有的项目。

3. 在项目文件夹中找到一个以 .csproj 结尾的文件,例如 `MyProject.csproj`。

4. 打开这个文件,你可以使用文本编辑器或者代码编辑器来编辑它。

5. csproj 文件是一个 XML 格式的文件,其中包含了项目的配置信息。你可以根据需要添加、修改或删除一些元素。

6. 例如,你可以添加 `` 元素来设置项目的属性,比如目标框架、输出路径等。

7. 你还可以添加 `` 元素来引用项目的源代码文件、资源文件、引用等。

8. 修改完毕后,保存 csproj 文件。

9. 在 Visual Studio 中,你可以右键点击项目,选择重新加载项目,以使修改生效。如果你在命令行中进行操作,则无需重新加载项目。

通过这些步骤,你就可以生成一个 C# 的 csproj 文件了。请记得根据项目的需要进行相应的配置和修改。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

我心依旧

CSDN认证博客专家

CSDN认证企业博客

码龄17年

暂无认证

5

原创

47万+

周排名

15万+

总排名

4820

访问

等级

74

积分

1

粉丝

2

获赞

1

评论

5

收藏

私信

关注

热门文章

xLang 的类型转换

2169

理解 C# 项目 csproj 文件格式的本质和编译流程

928

用xLang写Timer事件

726

用xLang 写 SQL 控制程序

510

简单控制 xLang 窗体

260

分类专栏

xLang&xStudio

4篇

最新评论

xLang 的一些常见故障和语法问题

CSDN-Ada助手:

恭喜作者发布了第7篇博客!不断分享关于xLang 的常见故障和语法问题,对于我们这些初学者来说,真的是非常有帮助。希望作者能够继续保持创作的热情,也希望能够看到更多关于xLang 的深入学习和应用案例的分享。加油!期待您的下一篇文章!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

xLang 的一些常见故障和语法问题

用msbuild自动创建nuget软件包

简单控制 xLang 窗体

2023年3篇

2020年4篇

目录

目录

分类专栏

xLang&xStudio

4篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

理解C#项目构建配置文件——MSBuild csproj文件 - 知乎

理解C#项目构建配置文件——MSBuild csproj文件 - 知乎首发于FreewheelLee的编程艺术切换模式写文章登录/注册理解C#项目构建配置文件——MSBuild csproj文件FreewheelLee​​Microsoft 全栈工程师内容概要什么是 csproj 文件和MSBuildcsproj 文件的主要构成元素C#项目构建过程 ( csproj 文件的解析过程 )小结和提示(MSBuild 涉及的内容非常多,同时官方文档也很齐全,本文不会一一细聊。本文的目的在于简要地描述整个MSBuild csproj 解析和执行的大概轮廓,指出一些 关键点,方便读者进一步深入学习。)什么是 MSBuild和csproj 文件 (MSBuild - MSBuild)The Microsoft Build Engine is a platform for building applications. This engine, which is also known as MSBuild, provides an XML schema for a project file that controls how the build platform processes and builds software. 简单的说 MSBuild 是一个构建应用程序的平台和工具,本文特指构建 C# 应用程序。MSBuild 使用 XML 格式的配置文件控制如何构建应用程序。MSBuild 跟 Visual Studio 是什么关系?Visual Studio uses MSBuild, but MSBuild doesn't depend on Visual Studio. By invoking msbuild.exe on your project or solution file, you can orchestrate and build products in environments where Visual Studio isn't installed.Visual Studio uses MSBuild to load and build managed projects. The project files in Visual Studio (.csproj, .vbproj, .vcxproj, and others) contain MSBuild XML code that executes when you build a project by using the IDE. Visual Studio projects import all the necessary settings and build processes to do typical development work, but you can extend or modify them from within Visual Studio or by using an XML editor.即 MSBuild 是一个独立的工具,Visual Studio 使用 MSBuid 加载和构建项目。当 Visual Studio 新建一个 C# 项目时,会在project folder(而不是 solution folder)下新建一个 csproj 文件,MSBuild 通过解析这个文件就知道如何构建当前的程序。看个简单的 csproj 文件例子 —— 一个非常简单的 XML 文件

Exe

net6.0

enable

enable

这就是 用 Visual Studio 新建的 Console Application project 的 csproj 文件,是不是非常简洁?甚至完全看不出这样一个简短的文件如何让 MSBuild 知道怎么构建这个项目。揭晓这个答案之前,先熟悉一下 csproj 文件的主要构成元素之后文章的内容都会使用 https://github.com/freewheel70/MSBuildSample 作为例子,读者可以自行 clone 下来操作。csproj 文件的主要构成元素为避免歧义,所有元素名我都保留了英文(如 Project元素)而斜体英文名不是元素名而是指代一类元素的种类名称如(如 Property 元素)Project 元素这是根元素,其中最重要的属性(元数据)之一就是上面看到的 Sdk ,稍后详解PropertyGroup 元素 和 Property 元素 (MSBuild Properties - MSBuild)顾名思义PropertyGroup 元素是一个 group 元素,子元素是一些 property 元素。而 property 元素是简单的键值对,即元素名为键,元素内容为值 (元素名字不是 Property)。例如,上面那个例子里的 PropertyGroup 里包含了OutputType, TargetFramework, ImplicitUsing 等 Property我们也可以自定义, 比如 新增一个 PropertyGroup

FreeLee

9876543

换句话说,你可以理解为 property 就是一些自定义变量。在构建的过程中可以利用这些变量值,比如作为判断语句的条件值,作为某个任务的输入,等等。重复定义了Property 会发生什么?如果后面的 Property 名字跟之前的相同,那么后面的值会覆盖前面的值。例如:

FreeLee

9876543

... ...

FreeLee2

那么在实际运行时, MyName 的值是 FreeLee2ItemGroup元素和Item元素 (MSBuild Items - MSBuild)顾名思义ItemGroup元素是一个 group 元素,子元素是一些 Item 元素Item 元素: 在 MSBuild 中,Item 是对一个或多个文件的引用, 包含元数据(如文件名、路径和版本号)一些常见的 Item 元素以及它们支持的元数据可以参考 Common MSBuild Project Items - MSBuild 和 更详细的内容参考https://github.com/dotnet/msbuild/blob/main/src/MSBuild/MSBuild/Microsoft.Build.CommonTypes.xsd 示例:

支持通配符Item 元素的元数据中最重要的就是 Include,指向了文件的路径,其他常见通用的元数据参考 MSBuild Well-known Item Metadata - MSBuild ,此外,不同的 Item 元素有不同的元数据定义,可以查阅上面的两个链接,例如

这段 xml 的意思是: 希望MSBuild每次构建总是将 mydata.json 复制到构建输出的文件夹里。效果如下图注意:Item 元素本身并不会要求MSBuild做任何操作,它只是非常纯粹的文件引用,CopyToOutputDirectory也只是一个元数据而不是动作。真正引导 MSBuild 构建的是后面马上会讲解的 Task。重复定义了Item 会发生什么?不同于 Property, 重复的 Item 不会相互覆盖,而是变成一个列表比如

那么 引用 Compile Item 时,就会获得一个包含了 file2.cs 和 file1.cs 的列表。 Target 元素和 Task 元素 (MSBuild Targets - MSBuild ,MSBuild Tasks - MSBuild)Target和Task MSBuild构建过程中最核心最重要的元素。Target 是一系列任务的组合(所以理解为 TaskGroup 也没毛病),Task 则是具体的任务 —— 比如,复制文件,输出信息,编译源码,构建引用的其他项目。Target 最重要的属性是AfterTargets, BeforeTargets 和 DependsOnTargets ,看名字就知道它们都是关于执行顺序的。Task 元素种类很多,最简单的就是 Message ,它做的事情就是在 console 上输出一段信息,比如 hello world 示例:

上面这个自定义名为 MyTarget 的 Target 会在 CoreCompile 后执行,执行时输出三段文本上面的 $(OS) $(PROCESSOR_ARCHITECTURE) 引用了环境变量,我们也可以使用 $(MyName) 来引用我们上面自定义的 Property更多常用的Task可以参考 MSBuild Task Reference - MSBuild 例如重复定义了Target会发生什么?跟 property 类似,重复定义的 Target 会覆盖之前的定义,例如

... ...

实际运行输出的是 Hello World 介绍完主要的元素后,开始正式理解 MSBuild project file 的解析和执行过程。正如文章开头的那个例子,一个非常简单的MSBuild Project file 里明明没有定义任何的 Target 和 task,为什么却能让 MSBuild 成功构建这个项目呢?答案就是 Project 元素的 Sdk 属性MSBuild 根据 Sdk 属性的值,会隐式地导入一些常见的 Properties 和 Targets 然后生成一个新的完整的详细的 MSBuild Project file (可以这么理解,虽然并不会真的生成一个文件)具体的生成逻辑是先导入sdk定义的常见的 properties再复制 MSBuild project file 的主体内容 最后导入sdk定义的常见的 targets对这个顺序的理解很重要,因为如果在 MSBuild project file 定义的 property 与sdk定义的常见的 property 重名,我们定义的值会成功覆盖默认值。如果在 MSBuild project file 定义的 targets与sdk定义的常见的 targets重名,我们定义的targets会被覆盖而不生效。这些常见的 Properties 和 Targets 的内容可以查看 sdk/src/Tasks/Microsoft.NET.Build.Tasks/sdk at main · dotnet/sdk 或者在本地文件夹 C:\Program Files\dotnet\sdk\6.0.202\Sdks\Microsoft.NET.Sdk\Sdk\ 下(根据安装的 sdk 版本不同可能路径不同)其中的导入逻辑相对复杂,这边不做展开。我们可以使用MSBuild CLI的一个参数 preprocess 生成完整的 MSBuild project file 方便我们理解,例如在我的示范项目下运行 (运行报错的读者可以看看文章结尾的小提示)msbuild -preprocess:.\MSBuildSample\Complete.csproj .\MSBuildSample\MSBuildSample.csproj就会得到一个Complete.csproj文件,打开这个文件,可以看到一些有意思的东西。首先是这个文件特别大,16000+行,但是其中有大量的注释,这些注释对理解这个生成过程非常有帮助,例如清晰地指出从什么地方导入了这些内容。通过搜索也可以验证上面说的3个步骤的顺序 —— 如,我们编写的MSBuild Project file 的内容被放在了中间。扩展点在 Complete.csproj 中搜索 AfterCompile注释中清楚地写着,如果你想在 Compile 结束后做点什么,可以重新定义 AfterCompile 这个target。即 AfterCompile 可以看作一个扩展点。怎么做呢? 在 MSBuildSample.csproj 里重新定义吗?读者可以试试,会发现不起作用。原因就是上面提到的2个点:1. MSBuildSample.csproj 的内容在最终的 Complete.csproj 中处于中间, 而 上面截图中的代码处于后面 2. 重复定义的 Target 会由后面覆盖前面,因此 在 MSBuildSample.csproj 里定义 AfterCompile target 会被覆盖正确的方式之一是新建一个 Directory.Build.targets 文件,然后在里面重新定义 AfterCompile target参考 https://github.com/freewheel70/MSBuildSample/blob/main/MSBuildSample/Directory.Build.targets 为什么是 Directory.Build.targets 呢? 因为 Directory.Build.targets 文件会在较后面才导入 —— 读者可以在 Complete.csproj 里验证。除了 AfterCompile,读者可以在 Complete.csproj 里查找其他的 扩展点target。小结Project, PropertyGroup, Property, ItemGroup, Item, Target, Task 是 MSBuild Project file 中最重要最常见的元素Project 的 sdk 属性会让 MSBuild 隐式地导入一些常见的 properties 和 targets通过新建一个 Directory.Build.targets 文件,定义所需要的 target 或者重新定义扩展点 target 可以引导 MSBuild 构建,执行我们需要的任务小提示msbuild 指令需要在 visual studio 的 terminal 下运行,在外部的 terminal 会报错 visual studio 里可以调整 MSBuild 输出日志的详细程度,方便学习进阶主题有兴趣进阶学习的读者可以考虑下面几个主题使用 Visual Studio 和 MSBuild.exe 构建有什么区别Item definitions —— 怎么自定义 Item Task 的输入和输出UsingTask 元素 —— 怎么自定义 TaskTargets 执行顺序 (Target Build Order - MSBuild) Parallel execution —— 并行执行其他 参考链接(或有趣的相关链接):How MSBuild builds projects - MSBuild MSBuild Tasks - MSBuild MSBuild Command-Line Reference - MSBuild https://github.com/dotnet/msbuild/tree/main/src/Tasks How can I get MSBuild to copy all files marked as Content to a folder, preserving folder structure? sdk/src/Tasks/Microsoft.NET.Build.Tasks/targets at main · dotnet/sdk https://github.com/dotnet/msbuild/blob/main/src/MSBuild/MSBuild/Microsoft.Build.CommonTypes.xsd 编辑于 2022-05-08 18:14C#msbuild.NET​赞同 39​​1 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录FreewheelLee的编程艺术微软全栈工程师,不定期分享各类技术和

.Csproj文件学习笔记 - N-COUNT - 博客园

.Csproj文件学习笔记 - N-COUNT - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

N-COUNT

学习进步

博客园

首页

新随笔

联系

订阅

管理

.Csproj文件学习笔记

.csproj是基于XML的格式。以下示例显示了使用.NET Core项目的根节点Microsoft.NET.Sdk。对于Web项目,使用的SDK是Microsoft.NET.Sdk.Web。

我们可以自己直接编辑.csproj文件,并手动添加必要的项目。所需的确切代码取决于需要链接的文件类型以及所需的MSBuild操作类型。

Visual Studio现在使用.csproj文件来管理项目。我们可以通过右键单击项目并选择Edit .csproj来编辑.csproj设置,如下所示。

 

上面项目的.csproj如下所示。

 

csproj文件包括与目标.NET Framework,项目文件夹,NuGet程序包引用等相关的设置。

.csproj是基于XML的格式。以下示例显示了使用.NET Core项目的根节点Microsoft.NET.Sdk。对于Web项目,使用的SDK是Microsoft.NET.Sdk.Web。

...

我们可以自己直接编辑.csproj文件,并手动添加必要的项目。所需的确切代码取决于需要链接的文件类型以及所需的MSBuild操作类型。

例如,如果我们要通过链接从项目外部添加.cs文件,则可以使用嵌套在中的元素

Include给出项目文件夹中文件的相对路径,Link属性告诉MSBuild将文件添加为链接,以及应该用于该文件的名称。甚至还可以更改文件名。

对于诸如JSON配置文件之类的内容文件,我们可以使用元素,例如:

在此示例中,我们将CopyToOutputDirectory设置为PreserveNewest,以便在构建或发布项目时将文件复制到输出目录。

PackageReference元素指定项目的NuGet依赖。Include属性指定包ID

Version属性指定要还原的软件包的版本。

IncludeAssets属性指定应使用属于指定包的哪些资产。默认情况下,包括所有包装资产。

ExcludeAssets属性指定不应消耗属于指定包的资产。

PrivateAssets属性指定应使用属于指定包的哪些资产,但不应流到下一个项目。的Analyzers,Build和ContentFiles资产都默认为私享此属性不存在。

多个目标框架

我们可以创建.NET Core应用程序并为其配置多个目标框架,以便它可以与所有已配置的目标框架一起运行。要定位多个框架,需要更改为复数,并包含我们要定位的不同框架的别名,并用;分隔:

netstandard2.0;net462

条件引用

我们可能会遇到的一个问题是,需要根据要构建的目标引用不同的程序集或NuGet程序包。

例如,我们将以下方法添加到我们的库中,它将成功编译.NET Standard 2.0目标,但是.NET 4.6.2目标将失败,因为它找不到.NET的定义HttpUtility。

public string JavaScriptEncode(string input)

{

return HttpUtility.JavaScriptStringEncode(input);

}

要解决此问题,我们需要添加对System.Web程序集的引用,但仅.NET 4.6.2目标需要它。为此,我们只需.csproj使用以下语法在文件中添加条件引用即可:

如果要有条件引用的NuGet程序包,则使用PackageReference。可以使用多个条件:

条件编译

有时我们可能想从某些目标的编译中排除某些C#文件。例如,以下是在NAudio中针对.NET 3.5目标的方法,我引用了System.Windows.Forms程序集,并从编译中排除了三个特定文件:

posted @

2020-10-21 01:52 

N-COUNT 

阅读(2607) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 N-COUNT

Powered by .NET 8.0 on Kubernetes

理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv - 博客园

理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

walterlv

博客园

首页

新随笔

联系

订阅

管理

理解 C# 项目 csproj 文件格式的本质和编译流程

 

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?

本文将直接从 csproj 文件格式的本质来看以上这些问题。

阅读本文,你将:

可以通读 csproj 文件,并说出其中每一行的含义

可以手工修改 csproj 文件,以实现你希望达到的高级功能(更高级的,可以开始写个工具自动完成这样的工作了)

理解新旧 csproj 文件的差异,不至于写工具解析和修改 csproj 文件的时候出现不兼容的错误

 

csproj 里面是什么?

总览 csproj 文件

相信你一定见过传统的 csproj 文件格式。就算你几乎从来没主动去看过里面的内容,在版本管理工具中解冲突时也在里面修改过内容。

不管你是新手还是老手,一定都会觉得这么长这么复杂的文件一定不是给人类阅读的。你说的是对的!传统 csproj 文件中有大量的重复或者相似内容,只为 msbuild 和 Visual Studio 能够识别整个项目的属性和结构,以便正确编译项目。

不过,既然这篇文章的目标是理解 csproj 文件格式的本质,那我当然不会把这么复杂的文件内容直接给你去阅读。

我已经将整个文件结构进行了极度简化,然后用思维导图进行了分割。总结成了下图,如果先不关注文件的细节,是不是更容易看懂了呢?

如果你此前也阅读过我的其他博客,会发现我一直在试图推荐使用新的 csproj 格式:

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件

让一个 csproj 项目指定多个开发框架

那么新格式和旧格式究竟有哪些不同使得新的格式如此简洁?

于是,我将新的 csproj 文件结构也进行简化,用思维导图进行了分割。总结成了下图:

比较两个思维导图之后,是不是发现其实两者本是相同的格式。如果忽略我在文字颜色上做的标记,其实两者的差异几乎只在文件开头是否有一个 xml 文件标记()。我在文字颜色上的标记代表着这部分的部件是否是可选的,白色代表必须,灰色代表可选;而更接近背景色的灰色代表一般情况下都是不需要的。

我把两个思维导图放到一起方便比较:

会发现,传统格式中 xml 声明、Project 节点、Import (props)、PropertyGroup、ItemGroup、Import (targets) 都是必要的,而新格式中只有 Project 节点 和 PropertyGroup 是必要的。

是什么导致了这样的差异?在了解 csproj 文件中各个部件的作用之前,这似乎很难回答。

了解 csproj 中的各个部件的作用

xml 声明部分完全没有在此解释的必要了,为兼容性提供了方便,详见:XML - Wikipedia。

接下来,我们不会依照部件出现的顺序安排描述的顺序,而是按照关注程度排序。

PropertyGroup

PropertyGroup 是用来存放属性的地方,这与它的名字非常契合。那么里面放什么属性呢?答案是——什么都能放!

在这里写属性就像在代码中定义属性或变量一样,只要写了,就会生成一个指定名称的属性。

比如,我们写:

walterlv is a 逗比

那么,就会生成一个 Foo 属性,值为字符串 walterlv is a 逗比。至于这个属性有什么用,那就不归这里管了。

这些属性的含义完全是由外部来决定的,例如在旧的 csproj 格式中,编译过程中会使用 TargetFrameworkVersion 属性,以确定编译应该使用的 .NET Framework 目标框架的版本(是 v4.5 还是 v4.7)。在新的 csproj 格式中,编译过程会使用 TargetFrameworks 属性来决定编译应该使用的目标框架(是 net47 还是 netstandard2.0)。具体是编译过程中的哪个环节哪个组件使用了此属性,我们后面会说。

从这个角度来说,如果你没有任何地方用到了你定义的属性,那为什么还要定义它呢?是的——这只是浪费。

PropertyGroup 可以定义很多个,里面都可以同等地放属性。至于为什么会定义多个,原因无外乎两个:

为了可读性——将一组相关的属性放在一起,便于阅读和理解意图(旧的 csproj 谈不上什么可读性)

为了加条件——有的属性在 Debug 和 Release 下不一样(例如条件编译符 DefineConstants)

额外说一下,Debug 和 Release 这两个值其实是在某处一个名为 Configuration 的属性定义的,它们其实只是普通的字符串而已,没什么特殊的意义,只是有很多的 PropertyGroup 加上了 Debug Release 的判断条件才使得不同的 Configuration 具有不同的其他属性,最终表现为编译后的巨大差异。由于 Configuration 属性可以放任意字符串,所以甚至可以定义一个非 Debug 和 Release 的配置(例如用于性能专项测试)也是可以的。

ItemGroup

ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!

是不是觉得这句话跟前面的 PropertyGroup 句式一模一样?是的——就是一模一样!csproj 中的两个大头都这样不带语义,几乎可以说明 csproj 文件是不包含语义的,它能够用来做什么事情纯属由其他模块来指定;这为 csproj 文件强大的扩展性提供了格式基础。

既然什么都能放,那我们放这些吧:

walterlv is a 逗比

walterlv is a 天才

天才向左,逗比向右

逗比属性额外加成

于是我们就有 4 个类型为 Foo 的项了,至于这 4 个 Foo 项有什么作用,那就不归这里管了。

这些项的含义与 PropertyGroup 一样也是由外部来决定。具体是哪个外部,我们稍后会说。但是我们依然有一些常见的项可以先介绍介绍:

Reference 引用某个程序集

PackageReference 引用某个 NuGet 包

ProjectReference 引用某个项目

Compile 常规的 C# 编译

None 没啥特别的编译选项,就为了执行一些通用的操作(或者是只是为了在 Visual Studio 列表中能够有一个显示)

Folder 一个空的文件夹,也没啥用(不过标了这个文件夹,Visual Studio 中就能有一个文件夹的显式,即便实际上这个文件夹可能不存在)

ItemGroup 也可以放很多组,一样是为了提升可读性或者增加条件。

Import

你应该注意到在前面的思维导图中,无论是新 csproj 还是旧 csproj 文件,我都写了两个 Import 节点。其实它们本质上是完全一样的,只不过在含义上有不同。前面我们了解到 csproj 文件致力于脱离语义,所以分开两个地方写几乎只是为了可读性考虑。

那么前面那个 Import 和后面的 Import 在含义上有何区别?思维导图的括号中我已说明了含义。前面是为了导入属性(props),后面是为了导入 Targets。属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分,所以我们放到最后再说。

那么,被我们 Import 进来的那些文件是什么呢?用两种扩展名,定义属性的那一种是 .props,定义行为的那一种是 .targets。

这两种文件除了含义不同以外,内容的格式都是完全一样的——而且——就是 csproj 文件的那种格式!没错,也包含 Project、Import、PropertyGroup、ItemGroup、Targets。只不过,相比于对完整性有要求的 csproj 文件来说,这里可以省略更多的节点。由于有 Import 的存在,所以一层一层地嵌套 props 或者 targets 都是可能的。

说了这么多,让我们来看其中两个 .props 文件吧。

先看看旧格式 csproj 文件中第一行一定会 Import 的那个 Microsoft.Common.props。

true

true

true

true

true

文件太长,做了大量删减,但也可以看到文件格式与 csproj 几乎是一样的。此文件中,根据其他属性的值有条件地定义了另一些属性。

再看看另一个 MSTest 单元测试项目中被隐式 Import 进 csproj 文件中的 .props 文件。(所谓隐式地 Import,只不过是被间接地引入,在 csproj 文件中看不到这个文件名而已。至于如何间接引入,因为涉及到 Targets,所以后面一起说明。)

Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dll

PreserveNewest

False

Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.dll

PreserveNewest

False

Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.dll

PreserveNewest

False

此文件中将三个 dll 文件从 MSTest 的 NuGet 包中以链接的形式包含到项目中,并且此文件在 Visual Studio 的解决方案列表中不可见。

可以看出,引入的 props 文件可以实现几乎与 csproj 文件中一样的功能。

那么,既然 csproj 文件中可以完全实现这样的功能,为何还要单独用 props 文件来存放呢?原因显而易见了——为了在多个项目中使用,一处更新,到处生效。所以有没有觉得很好玩——如果把版本号单独放到 props 文件中,就能做到一处更新版本号,到处更新版本号啦!

Target

终于开始说 Target 了。为什么会这么期待呢?因为前面埋下的各种伏笔几乎都要在这一节点得到解释了。

一般来说,Target 节点写在 csproj 文件的末尾,但这个并不是强制的。Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。而我们实质上的编译过程便全部由这些 Targets 来完成。我们甚至可以直接说——编译过程就是靠这些 Target 的组合来完成的。

如果你希望全面了解 Targets,推荐直接阅读微软的官方文档 MSBuild Targets,而本文只会对其进行一些简单的概述。当然如果你非常感兴趣,还可以阅读我另外几篇关于 Target 使用相关的文章:

如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - 吕毅

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - 吕毅

每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 - 吕毅

如何最快速地将旧的 NuGet 包 (2.x, packages.config) 升级成新的 NuGet 包 (4.x, PackageReference) - 吕毅

不过,为了简单地理解 Target,我依然需要借用官方文档的例子作为开头。

这份代码定义了一个名为 Construct 的 Target,这是随意取的一个名字,并不重要——但是编译过程中会执行这个 Target。在这个 Target 内部,使用了一个 msbuild 自带的名为 Csc 的 Task。这里我们再次引入了一个新的概念 Task。而 Task 是 Target 内部真正完成逻辑性任务的核心;或者说 Target 其实只是一种容器,本身并不包含编译逻辑,但它的内部可以存放 Task 来实现编译逻辑。一个 Target 内可以放多个 Task,不止如此,还能放 PropertyGroup 和 ItemGroup,不过这是仅在编译期生效的属性和项了。

@(Compile) 是 ItemGroup 中所有 Compile 类型节点的集合。还记得我们在 ItemGroup 小节时说到每一种 Item 的含义由外部定义吗?是的,就是在这里定义的!本身并没有什么含义,但它们作为参数传入到了具体的 Task 之后便有了此 Task 指定的含义。

于是 的含义便是调用 msbuild 内置的 C# 编译器编译所有 Compile 类型的项。

如果后面定义了一个跟此名称一样的 Target,那么后一个 Target 就会覆盖前一个 Target,导致前一个 Target 失效。

再次回到传统的 csproj 文件上来,每一个传统格式的 csproj 都有这样一行:

而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。只要引入了这个 .targets 文件,便能使用 msbuild 自带的编译任务完成绝大多数项目的编译。你可以自己去查看此文件中的内容,相信有以上 Target 的简单介绍,应该能大致理解其完成编译的流程。这是我的地址:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.CSharp.targets。

Project

所有的 csproj 文件都是以 Project 节点为根节点。既然是根节点为何我会在最后才说 Project 呢?因为这可是一个大悬念啊!本文一开始就描述了新旧两款 csproj 文件格式的差异,你也能从我的多篇博客中感受到新格式带来的各种好处;而简洁便是新格式中最大的好处之一。它是怎么做到简洁的呢?

就靠 Project 节点了。

注意到新格式中 Project 节点有 Sdk 属性吗?因为有此属性的存在,csproj 文件才能如此简洁。因为——所谓 Sdk,其实是一大波 .targets 文件的集合。它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。

如果你希望看看 Microsoft.NET.Sdk 都引入了哪些文件,可以去本机安装的 msbuild 或 dotnet 的目录下查看。当我使用 msbuild 编译时,我的地址:C:\Program Files\dotnet\sdk\2.1.200\Sdks\Microsoft.NET.Sdk\build\。比如你可以从此文件夹里的 Microsoft.NET.GenerateAssemblyInfo.targets 文件中发现 AssemblyInfo.cs 文件是如何自动生成及生效的。

编译器是如何将这些零散的部件组织起来的?

这里说的编译器几乎只指 msbuild 和 Roslyn,前者基于 .NET Framework,后者基于 .NET Core。不过,它们在处理我们的项目文件时的行为大多是一致的——至少对于通常项目来说如此。

我们前一部分介绍每个部件的时候,已经简单说了其组织方式,这里我们进行一个回顾和总结。

当 Visual Studio 打开项目时,它会解析里面所有的 Import 节点,确认应该引入的 .props 和 .targets 文件都引入了。随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。——这只是 Visual Studio 做的事情。

在编译时,msbuild 或 Roslyn 还会重新做一遍上面的事情——毕竟这两个才是真正的编译器,可不是 Visual Studio 的一部分啊。随后,执行编译过程。它们会按照 Target 指定的先后顺序来安排不同 Target 的执行,当执行完所有的 Target,便完成了编译过程。

新旧 csproj 在编译过程上有什么差异?

相信读完前面两个部分之后,你应该已经了解到在格式本身上,新旧格式之间其实并没有什么差异。或者更严格来说,差异只有一条——新格式在 Project 上指定了 Sdk。真正造成新旧格式在行为上的差别来源于默认为我们项目 Import 进来的那些 .props 和 .targets 不同。新格式通过 Microsoft.NET.Sdk 为我们导入了更现代化的 .props 和 .targets,而旧格式需要考虑到兼容性压力,只能引入旧的那些 .targets。

新的 Microsoft.NET.Sdk 以不兼容的方式支持了各种新属性,例如新的 TargetFrameworks 代替旧的 TargetFrameworkVersion,使得我们的 C# 项目可以脱离 .NET Framework,引入其他各种各样的目标框架,例如 netstandard2.0、net472、uap10.0 等(可以参考 从以前的项目格式迁移到 VS2017 新项目格式 - 林德熙)了解可以使用那些目标框架。

新的 Microsoft.NET.Sdk 以不兼容的方式原生支持了 NuGet 包管理。也就是说我们可以在不修改 csproj 的情况之下通过 NuGet 包来扩展 csproj 的功能。而旧的格式需要在 csproj 文件的末尾添加如下代码才可以获得其中一个 NuGet 包功能的支持:

This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.

不过好在 NuGet 4.x 以上版本在安装 NuGet 包时自动为我们在 csproj 中插入了以上代码。

更多资料

如果你在阅读本文时还有更多问题,可以阅读我和朋友的其他相关博客,也可以随时在下方向我留言。如果没有特别原因,我都是在一天之内进行回复。

项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量了) - 吕毅

让一个 csproj 项目指定多个开发框架 - 吕毅

从以前的项目格式迁移到 VS2017 新项目格式 - 林德熙

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件 - 吕毅

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference - 吕毅

posted @

2018-05-19 07:58 

walterlv 

阅读(9601) 

评论(1) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 walterlv

Powered by .NET 8.0 on Kubernetes

© 2014-2018 walterlv, all rights reserved.

Designed by: walterlv

如何运行 C# 程序 - Visual Studio (Windows) | Microsoft Learn

如何运行 C# 程序 - Visual Studio (Windows) | Microsoft Learn

跳转至主内容

此浏览器不再受支持。

请升级到 Microsoft Edge 以使用最新的功能、安全更新和技术支持。

下载 Microsoft Edge

有关 Internet Explorer 和 Microsoft Edge 的详细信息

目录

退出焦点模式

使用英语阅读

保存

目录

使用英语阅读

保存

打印

Twitter

LinkedIn

Facebook

电子邮件

目录

在 Visual Studio 中运行 C# 程序

项目

03/16/2023

7 个参与者

反馈

本文内容

如何运行程序取决于你从什么开始执行、程序的类型,以及你是否想在调试器下运行。 最简单的是在 Visual Studio 中生成并运行一个打开的项目,在这种情况下,可执行以下操作:

按 F5,从 Visual Studio 菜单中选择“调试”>“开始执行(调试)”,或在 Visual Studio 工具栏上选择绿色的“开始”箭头和项目名称 。

你也可以按 Ctrl+F5,或从 Visual Studio 菜单中选择“调试”>“开始执行(不调试)”,直接运行而不调试 。

从项目开始

你可以运行 C# 项目或 .csproj 文件(如果是可运行的程序)。 如果项目包含带有 Main 方法的 C# 文件,并且其输出为可执行文件(.exe 文件),则很可能会在项目成功生成后运行该文件。 较新版本的 C# 不需要 Main 方法;相反,程序执行从顶级语句开始。 请参阅不含 Main 方法的程序。

如果你的程序代码已在 Visual Studio 项目中,请打开该项目。 你可以执行以下操作来打开项目:双击或点击 Windows 文件资源管理器中的 .csproj 文件;或者在 Visual Studio 中选择“打开项目”,浏览以找到 .csproj 文件,然后选择该文件。

在 Visual Studio 中加载项目后,如果 Visual Studio 解决方案包含多个项目,请确保将带有 Main 方法的项目设置为启动项目。 要设置启动项目,请右键单击“解决方案资源管理器”中的项目名称或节点,然后从上下文菜单中选择“设置为启动项目” 。

要运行程序,请按 Ctrl+F5,从顶部菜单中选择“调试”>“开始执行(不调试)”,或选择绿色的“开始”按钮 。

Visual Studio 会尝试生成并运行你的项目。 在 Visual Studio 屏幕的底部,生成输出显示在“输出”窗口中,生成错误显示在“错误列表”窗口中 。

如果生成成功,应用会以适合项目类型的方式运行。 控制台应用在终端窗口中运行,Windows 桌面应用在新的桌面窗口中启动,Web 应用在由 IIS Express 承载的浏览器中运行。

从代码开始

如果是从代码清单、代码文件或少量文件开始,请首先确保该代码来自受信任的源,并且是可运行的程序。 具有 Main 方法的任何应用都可能是可运行的程序,但对于当前版本的 C#,不含 Main 方法但具有顶级语句的程序也可以运行。 你可以使用“控制台应用程序”模板创建一个项目,以便在 Visual Studio 中使用该应用。

单个文件的代码列表

启动 Visual Studio,并打开一个空的 C# 控制台应用程序项目。

将项目 .cs 文件中的所有代码替换为代码清单或文件的内容。

将项目 .cs 文件重命名为与你的代码文件名一致。

磁盘上有多个代码清单或文件

启动 Visual Studio,并创建适当类型的新项目。 如果不确定,请使用 C#“控制台应用程序”。

在新项目中,将项目代码文件中的所有代码替换为第一个代码清单或文件的内容。

重命名项目代码文件,使其与你的代码文件名一致。

对于其余的每个代码文件:

右键单击“解决方案资源管理器”中的项目节点,然后选择“添加”>“现有项”,或选择该项目,然后按 Shift+Alt+A 。

浏览到并选择要导入到项目中的代码文件。

文件夹中有多个文件

如果文件夹中有多个文件,请先查找项目或解决方案文件。 Visual Studio 创建的程序具有项目和解决方案文件。 在 Windows 文件资源管理器中,查找扩展名为 .csproj 或 .sln 的文件 。 双击 .csproj 文件,在 Visual Studio 中打开它。 请参阅从 Visual Studio 解决方案或项目开始。

如果代码来自其他开发环境,则没有项目文件。 在 Visual Studio 中选择“打开”>“文件夹”,打开该文件夹 。 请参阅开发代码而无需创建项目或解决方案。

从 GitHub 或 Azure DevOps 存储库开始

如果要运行的代码位于 GitHub 或 Azure DevOps 存储库中,则可以使用 Visual Studio 直接从存储库打开项目。 请参阅打开存储库中的项目。

运行程序

要开始生成程序,请按 Visual Studio 工具栏上的绿色“开始”按钮,或者按 F5 或 Ctrl+F5 。 使用“开始”按钮或 F5 在调试器下运行程序 。

Visual Studio 会尝试在你的项目中生成并运行代码。 如果生成不成功,请参阅以下部分,了解有关如何成功生成项目的一些建议。

疑难解答

你的代码可能有错误。 或者代码可能是正确的,但它可能依赖于缺少的程序集或 NuGet 包,或者针对其他版本的 .NET。 在这些情况下,可以轻松地修复生成。

添加引用

要正确生成,代码必须正确,并具有对库或其他依赖项的正确引用。 代码中的红色波浪下划线或错误列表中的条目表明存在错误,即使在编译和运行程序之前也是如此。 如果错误与未解析的名称相关,则可能需要添加引用和/或 using 指令。 如果代码引用了任何缺失的程序集或 NuGet 包,则需要将这些引用添加到项目。

Visual Studio 会尝试帮助你识别缺少的引用。 如果名称未解析,编辑器中会出现灯泡图标。 选择灯泡,可以看到有关如何修复此问题的一些建议。 解决方法可能是:

添加 using 指令。

添加对程序集的引用。

安装 NuGet 包。

添加 using 指令

下面是缺少的 using 指令的示例。 你可以将 using System; 添加到代码文件的开头,以解析无法解析的名称 Console:

较新版本的 C# 支持对一些常用命名空间使用隐式 using 指令,因此,如果在创建项目时选择了该选项,则不需要它们。

添加程序集引用

.NET 引用可以是程序集或 NuGet 包。 在源代码中,发布者或作者通常会说明代码所需的程序集以及它所依赖的包。 要手动添加对项目的引用,请右键单击“解决方案资源管理器”中的“引用”节点,然后选择“添加引用” 。 在“引用管理器”中,找到并添加所需的程序集。

你可以按照使用引用管理器添加或删除引用中的说明查找程序集并添加引用。

添加 NuGet 包

如果 Visual Studio 检测到缺少 NuGet 包,则会显示一个灯泡,并提供安装包的选项:

如果这不能解决问题,或者 Visual Studio 找不到包,请尝试联机搜索包。 请参阅在 Visual Studio 中安装和使用 NuGet 包。

使用正确版本的 .NET

由于不同版本的 .NET Framework 具有一定的后向兼容性,因此较新的框架可能会运行针对较旧的框架编写的代码,且不需要进行任何更改。 但有时需要针对特定的 .NET Framework 版本。 你可能需要安装特定版本的 .NET Framework 或 .NET Core。 请参阅修改 Visual Studio。

要更改目标 .NET Framework 版本,请参阅更改目标框架。 有关详细信息,请参阅 .NET Framework 目标错误疑难解答。

后续步骤

阅读欢迎使用 Visual Studio IDE,探索 Visual Studio 开发环境。

创建自己的第一个 C# 应用

其他资源

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

其他资源

本文内容

加州消费者隐私法案 (CCPA) 禁用图标

你的隐私选择

主题

高对比度

早期版本

博客

参与

隐私

使用条款

商标

© Microsoft 2024

.csproj 文件_csproj是什么文件-CSDN博客

>

.csproj 文件_csproj是什么文件-CSDN博客

.csproj 文件

最新推荐文章于 2022-05-01 20:48:03 发布

RayRings

最新推荐文章于 2022-05-01 20:48:03 发布

阅读量1.5w

收藏

49

点赞数

8

分类专栏:

C#

文章标签:

C#

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/m0_37805255/article/details/100104202

版权

C#

专栏收录该内容

6 篇文章

0 订阅

订阅专栏

.csproj 文件

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

【作用】

.csproj究竟是做什么用的?它是给开发工具用的,例如我们再熟悉不过的Visual Studio,以及大家可能没有接触过的MSBuild.exe。

Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作,MSBuild也会根据csproj文件来得知编译这个项目需要有哪些依赖,默认输出路径,Pre-Build和Post-Build需要哪些操作等。

Visual Studio和MSBuild都是开发工具,这就是csproj存在的唯一意义:为“开发工具”提供信息。而到了运行环境中,根本不会有人关心所谓的csproj文件——也就是“程序是从哪里来的”。

【各个部件的作用】

PropertyGroup

PropertyGrouph是用来存放属性的地方,这与它的名字非常契合。

在这里写属性就像在代码中定义属性或变量一样,只要写了,就会生成一个指定名称的属性。

比如,我们写:

watermelon is a fruit

那么,就会生成一个 Foo 属性,值为字符串 watermelon is a fruit。至于这个属性有什么用,那就不归这里管了。

PropertyGroup可以定义很多个,里面都可以同等地放属性。至于为什么会定义多个,原因无外乎有两个:

增加可读性 —— 将一组相关的属性放在一起,便于阅读和理解意图;便于加条件 —— 有的属性在 Debug 和 Release 下不一样(例如条件编译符 DefineConstants)。

ItemGroup

ItemGroup是用来指定集合的地方。

集合里面一些常见的项:

Reference:引用某个程序集PackageReference:引用某个NuGet包ProjectReference:引用某个项目Compile:常规的 C# 编译None:执行一些通用的操作(或者只是为了在 Visual Studio 列表中能够有一个显示)Folder:一个空的文件夹

ItemGroup 也可以放很多组,同样是为了提升可读性或者增加条件。

Import

Import是为了导入属性(props)和Targets(后面会具体说Targets)。

被我们 Import 进来的那些文件,可以用两种扩展名表示,一种是用来定义属性,为 .props;另一种用来定义行为,为 .targets。这两种文件除了含义不同以外,内容的格式都是完全一样的 —— 即 csproj 文件格式。

虽然 csproj 文件中可以完全实现引入的 props 文件的功能,但为了在多个项目中使用,一处更新,到处生效,因此选择单独用 props 文件来存放。

Target

一般来说, Target 节点写在 csproj 文件的末尾,但这个并不是强制的。Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。而我们实质上的编译过程便全部由这些 Targets 来完成。甚至可以说,编译过程就是靠这些 Target 的组合来完成的。

Project

所有的 csproj 文件都是以 Project 节点为根节点。

下面列出新旧两款 csproj 文件格式的差异:

其中,在各部件中,白色代表必须,灰色代表可选;而更接近背景色的灰色代表一般情况下都是不需要的。

可以看出,新格式的最大好处之一就是简洁。而这一优势,靠的就是 Project 节点,新格式中的 Project 节点有 sdk 属性 —— 所谓 sdk,其实是一大波 .targets 文件的集合。它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。

【 .sln 和 .csproj 的区别】

1. .sln:即 solution,解决方案

    .csproj:即 C sharp project,C# 项目

2. 解决方案是项目的集合,项目是文件的集合;一个 sln 中可以包含多个 csproj。一个 csproj 可以包含多个文件; csproj 可以作为单独的项目运行,也可以在 sln 中添加 csproj 统一管理。

3. sln 和 csproj 都可以双击运行,如果解决方案中只有一个项目,那么两个方式是没有区别的;但是如果一个解决方案中包含多个项目, sln 会加载该解决方案中所有的项目,而 csproj 只会加载当前项目。

4. 关于 sln 和 csproj 的几个问题

(1)C#、.net 中,.sln 文件可以删掉重新生成吗?

.sln 是项目文件,删除后项目的一些设置会无法恢复,因为解决方案里面可能有关于这个项目文件的很多信息,所以一般不建议删除重建;但一般也没有太大的问题,用VS直接打开 .csproj 工程文件,会自动建上 sln 的。

(2)下载的 ASP.net 源码没有.sln 或 .csproj 文件如何使用?

从 Visual Studio IDE 的菜单  "文件" --> "打开" --> "网站" ,然后从右边的目录中选择要打开的网站目录,不需要有 .sln 文件就可以打开网站并调试运行。如果是 WebSite 模式那么是不需要 .sln 文件的,可以通过 File -> WebSite -> OpenWebSite 打开。如果不是 WebSite 模式,那么可以自己建立一个空项目,然后把文件 Copy 进去即可。

 

参考链接:https://blog.csdn.net/han_better/article/details/64140875

优惠劵

RayRings

关注

关注

8

点赞

49

收藏

觉得还不错?

一键收藏

知道了

1

评论

.csproj 文件

.csproj 文件.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。【作用】.csproj究竟是做什么用的?它是给开发工具用的,例如我们再熟悉不过的Visual Studio,以...

复制链接

扫一扫

专栏目录

csproj 文件、sln文件的简单介绍。

weixin_30740581的博客

01-15

522

1.csproj文件:

.net 开发环境中建立项目时,会产生 .csproj 文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息等。Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作。为“开发环境”提供信息。到了运行环境中,iis根本不会关心所谓的csproj文件。 ...

无聊的CSPROJ 文件,很无聊

dennydaniel的专栏

05-28

1389

http://schemas.microsoft.com/developer/msbuild/2003">      Debug    AnyCPU    8.0.50727    2.0    {A626B36B-DA06-4DB5-8C00-BB7A52CB2AD8}    WinExe    Properties    ReadCardv1    ReadCardv1        true

1 条评论

您还未登录,请先

登录

后发表或查看评论

git提交数据教程

11-01

团队开发常用的git工具教程,这里提供的是上传文件教程的其中之一。

API_TEST.csproj.uesr

10-26

C#2416GPIO的项目文件,想要看的可借鉴借鉴

vscode-csproj:Visual Studio Code扩展,使您的csproj文件保持最新

05-16

VS Code .csproj扩展

此扩展名将帮助您在使用VS Code时使csproj文件保持同步。 如果您在同时使用VS Code和Visual Studio的团队中工作,这将很有用。

演示版

将文件添加到项目

从项目中删除文件

单个文件删除

多文件删除

这个怎么运作

当您切换到文件系统树或不在文件系统树中最近的.csproj保存文件时,系统将提示您。

选择“关闭”将在状态栏中添加一个项目,并且在您打开文件时不再询问您。

文件不在csproj中

csproj中包含的文件

您可以通过命令面板将文件添加到csproj:

或通过文件资源管理器中的上下文菜单:

扩展设置

此扩展程序提供以下设置:

设定键

描述

csproj.enable

启用/禁用此扩展名。

csproj.itemType

从文件扩展名到csproj XML元素的映射。 默认为: { "*": "Content

ASP.NET工程文件(.csproj)文件解读

knqiufan的博客

07-21

3492

C#项目中都会有一个不起眼的文件,后缀名csproj,很多人都会忽视它。其实,这个文件在项目中起到举足轻重的地位。这个文件其实是一个项目的工程文件,不过,正常开发中,这个文件基本上不会需要考虑到。这时候,你应该会问这个文件作用,其实,这个文件记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息等。

这个文件其实是给编译工具看的,这个文件记录了这个项目的项目名,项...

csproj内容解析

sgmcumt的博客

10-10

6980

文章目录指定目标框架指定多个目标框架新增其它项目属性项目引用普通NuGet包引用添加引用NuGet包的条件托管程序集引用添加COM组件引用本机文件引用项目引用编译嵌入式资源None输入其它

使用C#很长时间都没太关注,最近查看一些开源软件,有时候需要在csproj更改项目的配置信息,不得不熟悉里面的配置内容。

如果只是想了解csproj文件的配置项的含义,不太关注配置内容的细节,可以查看理解 C#...

用c#revit二开,如何在类库中导入wpf应用

weixin_42878539的博客

05-01

898

文章目录前言:一、问题描述二、解决步骤1.打开WPF、类库项目的.csproj文件2.添加程序集引用注意事项

前言:

最近在研究基于Revit的一些二次开发,Revit二次开发的研究意义在此不做赘述。目前针对Revit二次开发,社会上有使用python对Revit的Dynamo进行开发,同时主流的是使用c#对Revit进行插件的定制化设计。在制作插件的过程中发现无法将WPF界面封装到各个类库中,这就需要我们对项目设置进行一些调整,下面将具体介绍。

提示:以下是本篇文章正文内容,下面案例可供参考

一、问题

编辑csproj文件

qq_43563512的博客

08-03

2227

右键单击解决方案资源管理器中的项目,然后选择卸载项目>右键单击项目(在解决方案资源管理器中标记为不可用),然后单击“编辑yourproj.csproj”。这将打开您的CSPROJ文件进行编辑。>进行任何所需的更改后,保存并关闭文件。在节点上再次右键单击,完成后选择重新加载项目。

...

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

weixin_30413739的博客

08-17

572

csproj文件大家应该不会陌生,那就是C#项目文件的扩展名,它是“C Sharp Project”的缩写。 那么它究竟是给谁用的呢?那是给开发工具用的,例如我们在熟悉不过的Visual Studio,以及大家可以没有接触过,但是应该都听说过的MSBuild.exe。Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作,MSBuild也会...

VS.net VSS时,编译报错:未能向文件“.csproj.FileListAbsolute.txt”写入命令行 对路径 的访问被拒绝。

09-06

在VSS上把项目的Bin和Obj目录删除,然后重新取出项目,编译成功。

ProjectSync:这个基本的控制台应用程序使您的 *.csproj 文件与文件系统更改保持同步,使其在不专门使用 Visual Studio 进行开发的团队中工作时非常有用

07-01

项目同步

这个基本的控制台应用程序使您的 csproj 文件与文件系统更改保持同步,这在不专门使用 Visual Studio 进行开发的团队中工作时非常有用。

它目前支持单个命令行参数——要观察的工作目录。

它支持大量配置选项,所有选项都有“合理”的默认值,可以在 program.cs 的顶部看到

无法读取项目文件 .csproj,请确认 Import 声明中的路径正确

07-09

无法读取项目文件 .csproj,请确认 Import 声明中的路径正确.doc

无法打开项目文件.csproj”

nan2008zzu的专栏

08-07

2318

打开 一个完成项目时,双击.sln文件,用VS2010打开,结果报错  

无法打开项目文件.csproj”,此安装不支持该项目类型。

解决办法,不要直接打开.sln文件,先把VS打开,然后 ’文件‘---’打开 ‘---’网站。。。‘  打开即可

VS无法读取项目文件?

weixin_33857679的博客

08-04

1497

解决无法读取项目文件"***.csproj",系统找不到指定路径以上情况可能由于2个问题出现的,1 路径不对。 2 开发工具与打开工具版本不对

解决办法:

解决路径不对:针对路径不对,我们可以用以下办法解决 用记事本打开sln文件,将绝对路径修改为相对路径就行了例如:Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "E...

ASP工程文件(csproj)解读

二哈的欢乐世界

10-29

5802

C#项目中都会有一个不起眼的文件,后缀名csproj,很多人都会忽视它。其实,这个文件在项目中起到举足轻重的地位。这个文件其实是一个项目的工程文件,不过,正常开发中,这个文件基本上不会需要考虑到。这时候,你应该会问这个文件作用,其实,这个文件记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息等。

这个文件其实是给编译工具看的,这个文件记录了这个项目的项目名,项

.sln .suo .csproj .csproj.user简单介绍【转】

dixiannie4307的博客

12-01

440

.sln: solution. 即解决方案. 它引用了这个解决方案中所包含的项目, 一个解决方案一般会有几个项目的,即.csproj. 里面写有项目的路径, 改变路径, 打开.sln的时候,就看不到那个项目了.(Add:加入VS的版本号,Project GUID号,项目名,引用工程名,工程平台Debug|Release参数配置)

.suo: 是solution user option的...

*.csproj项目文件理解(VS2008)

dataadapters的专栏

07-20

1859

*.csproj文件,即某个项目的项目文件,管理某个项目的各项目信息;文件整体结构:

.csproj文件怎么打开

最新发布

11-15

你可以使用Visual Studio打开.csproj文件。如果你没有安装Visual Studio,你也可以使用文本编辑器打开.csproj文件,例如Notepad++或Visual Studio Code。在文本编辑器中打开.csproj文件,你可以查看和编辑项目文件的...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

RayRings

CSDN认证博客专家

CSDN认证企业博客

码龄7年

暂无认证

55

原创

4万+

周排名

28万+

总排名

25万+

访问

等级

2347

积分

201

粉丝

258

获赞

77

评论

1118

收藏

私信

关注

热门文章

C语言零基础入门(一 简介)

33072

5G学习:5G总体架构

32017

Wasserstein距离

27143

.csproj 文件

15595

在Modbus主站与从站之间进行大数据量通信的方法

12901

分类专栏

Shell

编程

计算机硬核

2篇

5G

4篇

数据库

3篇

C++

1篇

硬件系统

1篇

Git

3篇

面试经验

2篇

.NET

3篇

企业架构

1篇

C#

6篇

C

8篇

论文笔记

1篇

Java

6篇

云计算

高数/线代/概率论

1篇

机器学习

5篇

深度学习

1篇

通信

16篇

最新评论

Wasserstein距离

Tisfy:

Wasserstein距离

以後╮的路、:

你也太夸张了吧

5G学习:5G基础概念

大风车一直转悠悠:

很有科普性的一篇文章

c# Thread、ThreadPool、Task有什么区别,什么时候用,以及Task的使用

HT002..:

threadpool不是能取消线程?、

为什么样本方差(sample variance)的分母是 n-1?

ghost_heartbeat:

专门登陆来喷你的,抄别人作业都抄不明白?

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

MAC突然打不开Notion,你遇到过这个问题吗?

聊聊内存那点事儿

二进制、八进制、十进制以及十六进制之间的转换

2023年1篇

2022年2篇

2021年7篇

2020年4篇

2019年53篇

目录

目录

分类专栏

Shell

编程

计算机硬核

2篇

5G

4篇

数据库

3篇

C++

1篇

硬件系统

1篇

Git

3篇

面试经验

2篇

.NET

3篇

企业架构

1篇

C#

6篇

C

8篇

论文笔记

1篇

Java

6篇

云计算

高数/线代/概率论

1篇

机器学习

5篇

深度学习

1篇

通信

16篇

目录

评论 1

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

理解 C# 项目 csproj 文件格式的本质和编译流程_.csproj-CSDN博客

>

理解 C# 项目 csproj 文件格式的本质和编译流程_.csproj-CSDN博客

理解 C# 项目 csproj 文件格式的本质和编译流程

最新推荐文章于 2024-03-07 14:53:15 发布

我心依旧

最新推荐文章于 2024-03-07 14:53:15 发布

阅读量929

收藏

5

点赞数

2

文章标签:

c#

wpf

开发语言

原文链接:http://www.fogsvc.com/3024.html

版权

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?

本文将直接从 csproj 文件格式的本质来看以上这些问题。

阅读本文,你将:

可以通读 csproj 文件,并说出其中每一行的含义

可以手工修改 csproj 文件,以实现你希望达到的高级功能(更高级的,可以开始写个工具自动完成这样的工作了)

理解新旧 csproj 文件的差异,不至于写工具解析和修改 csproj 文件的时候出现不兼容的错误

csproj 里面是什么?

一、总览 csproj 文件

相信你一定见过传统的 csproj 文件格式。就算你几乎从来没主动去看过里面的内容,在版本管理工具中解冲突时也在里面修改过内容。

不管你是新手还是老手,一定都会觉得这么长这么复杂的文件一定不是给人类阅读的。你说的是对的!传统 csproj 文件中有大量的重复或者相似内容,只为 msbuild 和 Visual Studio 能够识别整个项目的属性和结构,以便正确编译项目。

不过,既然这篇文章的目标是理解 csproj 文件格式的本质,那我当然不会把这么复杂的文件内容直接给你去阅读。

我已经将整个文件结构进行了极度简化,然后用思维导图进行了分割。总结成了下图,如果先不关注文件的细节,是不是更容易看懂了呢?

如果你此前也阅读过我的其他博客,会发现我一直在试图推荐使用新的 csproj 格式:

将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件

让一个 csproj 项目指定多个开发框架

那么新格式和旧格式究竟有哪些不同使得新的格式如此简洁?

于是,我将新的 csproj 文件结构也进行简化,用思维导图进行了分割。总结成了下图:

比较两个思维导图之后,是不是发现其实两者本是相同的格式。如果忽略我在文字颜色上做的标记,其实两者的差异几乎只在文件开头是否有一个 xml 文件标记()。我在文字颜色上的标记代表着这部分的部件是否是可选的,白色代表必须,灰色代表可选;而更接近背景色的灰色代表一般情况下都是不需要的。

我把两个思维导图放到一起方便比较:

会发现,传统格式中 xml 声明、Project 节点、Import (props)、PropertyGroup、ItemGroup、Import (targets) 都是必要的,而新格式中只有 Project 节点 和 PropertyGroup 是必要的。

是什么导致了这样的差异?在了解 csproj 文件中各个部件的作用之前,这似乎很难回答。

二、了解 csproj 中的各个部件的作用

xml 声明部分完全没有在此解释的必要了,为兼容性提供了方便,详见:XML – Wikipedia。

接下来,我们不会依照部件出现的顺序安排描述的顺序,而是按照关注程度排序。

1.PropertyGroup

PropertyGroup 是用来存放属性的地方,这与它的名字非常契合。那么里面放什么属性呢?答案是——什么都能放!

在这里写属性就像在代码中定义属性或变量一样,只要写了,就会生成一个指定名称的属性。

比如,我们写:

walterlv is a 逗比

那么,就会生成一个 Foo 属性,值为字符串 walterlv is a 逗比。至于这个属性有什么用,那就不归这里管了。

这些属性的含义完全是由外部来决定的,例如在旧的 csproj 格式中,编译过程中会使用 TargetFrameworkVersion 属性,以确定编译应该使用的 .NET Framework 目标框架的版本(是 v4.5 还是 v4.7)。在新的 csproj 格式中,编译过程会使用 TargetFrameworks 属性来决定编译应该使用的目标框架(是 net47 还是 netstandard2.0)。具体是编译过程中的哪个环节哪个组件使用了此属性,我们后面会说。

从这个角度来说,如果你没有任何地方用到了你定义的属性,那为什么还要定义它呢?是的——这只是浪费。

PropertyGroup 可以定义很多个,里面都可以同等地放属性。至于为什么会定义多个,原因无外乎两个:

为了可读性——将一组相关的属性放在一起,便于阅读和理解意图(旧的 csproj 谈不上什么可读性)

为了加条件——有的属性在 Debug 和 Release 下不一样(例如条件编译符 DefineConstants)

额外说一下,Debug 和 Release 这两个值其实是在某处一个名为 Configuration 的属性定义的,它们其实只是普通的字符串而已,没什么特殊的意义,只是有很多的 PropertyGroup 加上了 Debug Release 的判断条件才使得不同的 Configuration 具有不同的其他属性,最终表现为编译后的巨大差异。由于 Configuration 属性可以放任意字符串,所以甚至可以定义一个非 Debug 和 Release 的配置(例如用于性能专项测试)也是可以的。

2.ItemGroup

ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!

是不是觉得这句话跟前面的 PropertyGroup 句式一模一样?是的——就是一模一样!csproj 中的两个大头都这样不带语义,几乎可以说明 csproj 文件是不包含语义的,它能够用来做什么事情纯属由其他模块来指定;这为 csproj 文件强大的扩展性提供了格式基础。

既然什么都能放,那我们放这些吧:

walterlv is a 逗比walterlv is a 天才天才向左,逗比向右逗比属性额外加成

于是我们就有 4 个类型为 Foo 的项了,至于这 4 个 Foo 项有什么作用,那就不归这里管了。

这些项的含义与 PropertyGroup 一样也是由外部来决定。具体是哪个外部,我们稍后会说。但是我们依然有一些常见的项可以先介绍介绍:

Reference 引用某个程序集PackageReference 引用某个 NuGet 包ProjectReference 引用某个项目Compile 常规的 C# 编译None 没啥特别的编译选项,就为了执行一些通用的操作(或者是只是为了在 Visual Studio 列表中能够有一个显示)Folder 一个空的文件夹,也没啥用(不过标了这个文件夹,Visual Studio 中就能有一个文件夹的显式,即便实际上这个文件夹可能不存在)

ItemGroup 也可以放很多个,一样是为了提升可读性或者增加条件。

3.Import

你应该注意到在前面的思维导图中,无论是新 csproj 还是旧 csproj 文件,我都写了两个 Import 节点。其实它们本质上是完全一样的,只不过在含义上有不同。前面我们了解到 csproj 文件致力于脱离语义,所以分开两个地方写几乎只是为了可读性考虑。

那么前面那个 Import 和后面的 Import 在含义上有何区别?思维导图的括号中我已说明了含义。前面是为了导入属性(props),后面是为了导入 Targets。属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分,所以我们放到最后再说。

那么,被我们 Import 进来的那些文件是什么呢?用两种扩展名,定义属性的那一种是 .props,定义行为的那一种是 .targets。

这两种文件除了含义不同以外,内容的格式都是完全一样的——而且——就是 csproj 文件的那种格式!没错,也包含 Project、Import、PropertyGroup、ItemGroup、Targets。只不过,相比于对完整性有要求的 csproj 文件来说,这里可以省略更多的节点。由于有 Import 的存在,所以一层一层地嵌套 props 或者 targets 都是可能的。

说了这么多,让我们来看其中两个 .props 文件吧。

先看看旧格式 csproj 文件中第一行一定会 Import 的那个 Microsoft.Common.props。

truetruetruetruetrue

文件太长,做了大量删减,但也可以看到文件格式与 csproj 几乎是一样的。此文件中,根据其他属性的值有条件地定义了另一些属性。

再看看另一个 MSTest 单元测试项目中被隐式 Import 进 csproj 文件中的 .props 文件。(所谓隐式地 Import,只不过是被间接地引入,在 csproj 文件中看不到这个文件名而已。至于如何间接引入,因为涉及到 Targets,所以后面一起说明。)

Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dllPreserveNewestFalseMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.dllPreserveNewestFalseMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.dllPreserveNewestFalse

此文件中将三个 dll 文件从 MSTest 的 NuGet 包中以链接的形式包含到项目中,并且此文件在 Visual Studio 的解决方案列表中不可见。

可以看出,引入的 props 文件可以实现几乎与 csproj 文件中一样的功能。

那么,既然 csproj 文件中可以完全实现这样的功能,为何还要单独用 props 文件来存放呢?原因显而易见了——为了在多个项目中使用,一处更新,到处生效。所以有没有觉得很好玩——如果把版本号单独放到 props 文件中,就能做到一处更新版本号,到处更新版本号啦!

4.Target

终于开始说 Target 了。为什么会这么期待呢?因为前面埋下的各种伏笔几乎都要在这一节点得到解释了。

一般来说,Target 节点写在 csproj 文件的末尾,但这个并不是强制的。Targets 是一种非常强大的功能扩展方式,支持 msbuild 预定义的一些指令,支持命令行,甚至支持使用 C# 直接编写(当然编译成 dll 会更方便些),还支持这些的排列组合和顺序安排。而我们实质上的编译过程便全部由这些 Targets 来完成。我们甚至可以直接说——编译过程就是靠这些 Target 的组合来完成的。

如果你希望全面了解 Targets,推荐直接阅读微软的官方文档 MSBuild Targets,而本文只会对其进行一些简单的概述(我即将用另一篇博客来详细讲解,不然这篇就太长了)。

不过,为了简单地理解 Target,我依然需要借用官方文档的例子作为开头。

这份代码定义了一个名为 Construct 的 Target,这是随意取的一个名字,并不重要——但是编译过程中会执行这个 Target。在这个 Target 内部,使用了一个 msbuild 自带的名为 Csc 的 Task。这里我们再次引入了一个新的概念 Task。而 Task 是 Target内部真正完成逻辑性任务的核心;或者说 Target 其实只是一种容器,本身并不包含编译逻辑,但它的内部可以存放 Task 来实现编译逻辑。一个 Target 内可以放多个 Task,不止如此,还能放 PropertyGroup 和 ItemGroup,不过这是仅在编译期生效的属性和项了。

@(Compile) 是 ItemGroup 中所有 Compile 类型节点的集合。还记得我们在 ItemGroup 小节时说到每一种 Item 的含义由外部定义吗?是的,就是在这里定义的!本身并没有什么含义,但它们作为参数传入到了具体的 Task 之后便有了此 Task 指定的含义。

于是  的含义便是调用 msbuild 内置的 C# 编译器编译所有 Compile 类型的项。

如果后面定义了一个跟此名称一样的 Target,那么后一个 Target 就会覆盖前一个 Target,导致前一个 Target 失效。

再次回到传统的 csproj 文件上来,每一个传统格式的 csproj 都有这样一行:

而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。只要引入了这个 .targets 文件,便能使用 msbuild 自带的编译任务完成绝大多数项目的编译。你可以自己去查看此文件中的内容,相信有以上 Target 的简单介绍,应该能大致理解其完成编译的流程。这是我的地址:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.CSharp.targets。

5.Project

所有的 csproj 文件都是以 Project 节点为根节点。既然是根节点为何我会在最后才说 Project 呢?因为这可是一个大悬念啊!本文一开始就描述了新旧两款 csproj 文件格式的差异,你也能从我的多篇博客中感受到新格式带来的各种好处;而简洁便是新格式中最大的好处之一。它是怎么做到简洁的呢?

就靠 Project 节点了。

注意到新格式中 Project 节点有 Sdk 属性吗?因为有此属性的存在,csproj 文件才能如此简洁。因为——所谓 Sdk,其实是一大波 .targets 文件的集合。它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。

如果你希望看看 Microsoft.NET.Sdk 都引入了哪些文件,可以去本机安装的 msbuild 或 dotnet 的目录下查看。当我使用 msbuild 编译时,我的地址:C:\Program Files\dotnet\sdk\2.1.200\Sdks\Microsoft.NET.Sdk\build\。比如你可以从此文件夹里的 Microsoft.NET.GenerateAssemblyInfo.targets 文件中发现 AssemblyInfo.cs 文件是如何自动生成及生效的。

编译器是如何将这些零散的部件组织起来的?

这里说的编译器几乎只指 msbuild 和 Roslyn,前者基于 .NET Framework,后者基于 .NET Core。不过,它们在处理我们的项目文件时的行为大多是一致的——至少对于通常项目来说如此。

我们前一部分介绍每个部件的时候,已经简单说了其组织方式,这里我们进行一个回顾和总结。

当 Visual Studio 打开项目时,它会解析里面所有的 Import 节点,确认应该引入的 .props 和 .targets 文件都引入了。随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。——这只是 Visual Studio 做的事情。

在编译时,msbuild 或 Roslyn 还会重新做一遍上面的事情——毕竟这两个才是真正的编译器,可不是 Visual Studio 的一部分啊。随后,执行编译过程。它们会按照 Target 指定的先后顺序来安排不同 Target 的执行,当执行完所有的 Target,便完成了编译过程。

新旧 csproj 在编译过程上有什么差异?

相信读完前面两个部分之后,你应该已经了解到在格式本身上,新旧格式之间其实并没有什么差异。或者更严格来说,差异只有一条——新格式在 Project 上指定了 Sdk。真正造成新旧格式在行为上的差别来源于默认为我们项目 Import 进来的那些 .props 和 .targets 不同。新格式通过 Microsoft.NET.Sdk 为我们导入了更现代化的 .props 和 .targets,而旧格式需要考虑到兼容性压力,只能引入旧的那些 .targets。

新的 Microsoft.NET.Sdk 以不兼容的方式支持了各种新属性,例如新的 TargetFrameworks 代替旧的 TargetFrameworkVersion,使得我们的 C# 项目可以脱离 .NET Framework,引入其他各种各样的目标框架,例如 netstandard2.0、net472、uap10.0 等(可以参考 从以前的项目格式迁移到 VS2017 新项目格式 – 林德熙)了解可以使用那些目标框架。

新的 Microsoft.NET.Sdk 以不兼容的方式原生支持了 NuGet 包管理。也就是说我们可以在不修改 csproj 的情况之下通过 NuGet 包来扩展 csproj 的功能。而旧的格式需要在 csproj 文件的末尾添加如下代码才可以获得其中一个 NuGet 包功能的支持:

不过好在 NuGet 4.x 以上版本在安装 NuGet 包时自动为我们在 csproj 中插入了以上代码。

优惠劵

我心依旧

关注

关注

2

点赞

5

收藏

觉得还不错?

一键收藏

知道了

0

评论

理解 C# 项目 csproj 文件格式的本质和编译流程

写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗?本文将直接从 csproj 文件格式的本质来看以上这些问题。

复制链接

扫一扫

获取C#项目包含的所有程序文件的源代码

12-12

获取C#项目包含的所有程序文件的源代码,包含项目文件SLN的解析,解决方案CSPROJ的解析,XML命名空间的适配。

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

weixin_30413739的博客

08-17

572

csproj文件大家应该不会陌生,那就是C#项目文件的扩展名,它是“C Sharp Project”的缩写。 那么它究竟是给谁用的呢?那是给开发工具用的,例如我们在熟悉不过的Visual Studio,以及大家可以没有接触过,但是应该都听说过的MSBuild.exe。Visual Studio会根据csproj里的XML定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作,MSBuild也会...

参与评论

您还未登录,请先

登录

后发表或查看评论

csproj内容解析

sgmcumt的博客

10-10

6980

文章目录指定目标框架指定多个目标框架新增其它项目属性项目引用普通NuGet包引用添加引用NuGet包的条件托管程序集引用添加COM组件引用本机文件引用项目引用编译嵌入式资源None输入其它

使用C#很长时间都没太关注,最近查看一些开源软件,有时候需要在csproj更改项目的配置信息,不得不熟悉里面的配置内容。

如果只是想了解csproj文件的配置项的含义,不太关注配置内容的细节,可以查看理解 C#...

vs2019 .NET CORE csproj 文件编辑点

pehao的博客

10-19

1297

1. 引用框架,Microsoft.NETCore.App,手动打开xxx.csproj文件,添加以下节点

2.输出时,不输出\bin\debug\netcore3.1目录

netc

MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata

aijianxie8808的博客

04-22

318

在软件项目不断的进展中,MSBuild 脚本可能几个月都不会被修改,因为通常编译和发布的目录是不经常变化的。

但,一旦某天你需要修改了,看到那一堆 $(Something)、 @(Something)、%(Something) 是相当的头大,不得不搜索 MSDN 才能找到合理的用法。

每次看到下面这样的语法,我都感觉,有必要把语法设计成这样吗?

1

.csproj 文件

热门推荐

m0_37805255的博客

08-28

1万+

.csproj 文件

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

【作用】

.csproj究竟是做什么用的?它是给开发工具用的,例如我们再熟悉不过的Visual Studio,以...

csproj文件常用设置及C#注释常用写法

博客

06-29

774

csproj文件常用设置及C#注释常用写法

修改.csproj文件_从.NET Core将现有.NET项目文件升级为精益的新CSPROJ格式

10-13

1055

修改.csproj文件If you've looked at csproj (C# (csharp) projects) in the past in a text editor you probably looked away quickly. They are effectively MSBuild files that orchestrate the build process. Phras...

【CSharp】关于xxx.csproj文件的理解

jn10010537的博客

07-21

593

Visual Studio会根据csproj里的内容来定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作。.csproj文件记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。在.NET框架的开发环境中建立项目时,会产生.csproj文件,这是C#的项目工程文件。csproj的全称是C Sharp Project的缩写,是C#项目文件的扩展名。上面的iRayBase.csproj 文件后缀是 .csproj。在示例代码里,遇到.csproj 文件。

C#动态执行与编译

09-14

C#动态执行与编译,实现了动态编译并执行指定类(代码)的函数的方法。

拖放打开文件,C#获取文件目录路径

03-16

摘要:C#源码,文件操作,获取路径,拖放文件 拖放打开文件,C#获取文件的目录或路径信息,只需拖动文件到主窗体中,即可获取到所选文件所在的目录路径,弹出窗口告诉你。这种拖放打开文件的方法也是Windows系统所特有...

使用.NET命令行编译器编译项目(如ASP.NET、C#等)

01-21

源程序最好有.csproj或.vbproj文件,没有的话,要花些时间调试 下面我以VB.NET做示例讲解一下:   从proj我们可以获取以下有用信息   Settings小节中有很多配置选项,对应一些编译器选项 小节中是项目的引用,第3...

C#二维码识别和生成的源码,VS2017直接编译

03-16

Zxing库的源码,C#语言 ,VS编译器,.net4.0以上框架支持,包含二维码生成和识别模块,支持常规一维条形码,QR、DM等二维码,进行了识别优化,测试成功率99%。

1768.交替合并字符串

明确的爱,真诚的喜欢,直接的厌恶,站在太阳底下的坦荡,被坚定的选择。

03-07

152

给你两个字符串 word1 和 word2。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。使用两个指针i和j,初始时分别指向两个字符串的首个位置。如果i没有超出word1的范围,就将word1[i]加入答案,并且将i移动一个位置;如果j没有超出word2的范围,就将word2[j]加入答案,并且将j移动一个位置。当i和j都超出对应的范围后,结束循环并返回答案即可。返回 合并后的字符串。

C#通过配置文件动态修改web.config内容

lxyforever5的博客

03-07

338

Web.setting.config内容,存放一些配置信息,内容具体情况具体设置。Web.aaa.config内容,存放连接数据库的信息。1. Web.config配置文件内的处理。3.进行动态修改,具体情况具体操作。

[C#]winform部署yolov9的onnx模型

FL1623863129的博客

03-04

930

C#实现全网yolov7目前最快winform目标检测,使用C#部署openvino-yolov5s模型,使用C++部署yolov8的onnx和bytetrack实现目标追踪,用opencv和onnxruntime去部署yolov5-7-8,使用C#调用libotrch-yolov5模型实现全网最快winform目标检测。这不仅展示了YOLO系列模型在实际应用中的价值,也体现了C# WinForms在构建用户界面和集成深度学习模型方面的优势。在当今的计算机视觉领域,目标检测是不可或缺的一项技术。

C# 不可识别数据库格式问题

hspx668的博客

03-04

898

可以尝试使用数据库管理工具(比如Access自带的修复工具)对数据库文件进行修复,或者尝试连接其他已知可用的数据库文件进行测试。5. 使用正确的连接字符串:在连接数据库时,需要使用正确的连接字符串来指定数据库文件的位置、类型和其他必要信息。总之,当遇到C#中不可识别的数据库格式错误时,重要的是要仔细检查并排除各种可能导致问题的原因,并采取适当的措施来解决问题,以确保应用程序能够顺利地连接和操作数据库。总之,当遇到数据库格式不可识别的错误时,首先需要仔细检查错误消息,确定出现错误的具体位置和原因。

ManualResetEvent 在线程中的使用C#

最新发布

weixin_40314351的博客

03-07

364

ManualResetEvent 用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。

c#如何生成csproj文件

07-28

生成一个 C# 的 csproj 文件可以通过以下步骤完成:

1. 打开 Visual Studio 或者你喜欢的代码编辑器。

2. 创建一个新的 C# 项目或者打开一个已有的项目。

3. 在项目文件夹中找到一个以 .csproj 结尾的文件,例如 `MyProject.csproj`。

4. 打开这个文件,你可以使用文本编辑器或者代码编辑器来编辑它。

5. csproj 文件是一个 XML 格式的文件,其中包含了项目的配置信息。你可以根据需要添加、修改或删除一些元素。

6. 例如,你可以添加 `` 元素来设置项目的属性,比如目标框架、输出路径等。

7. 你还可以添加 `` 元素来引用项目的源代码文件、资源文件、引用等。

8. 修改完毕后,保存 csproj 文件。

9. 在 Visual Studio 中,你可以右键点击项目,选择重新加载项目,以使修改生效。如果你在命令行中进行操作,则无需重新加载项目。

通过这些步骤,你就可以生成一个 C# 的 csproj 文件了。请记得根据项目的需要进行相应的配置和修改。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

我心依旧

CSDN认证博客专家

CSDN认证企业博客

码龄17年

暂无认证

5

原创

47万+

周排名

15万+

总排名

4821

访问

等级

74

积分

1

粉丝

2

获赞

1

评论

5

收藏

私信

关注

热门文章

xLang 的类型转换

2169

理解 C# 项目 csproj 文件格式的本质和编译流程

928

用xLang写Timer事件

726

用xLang 写 SQL 控制程序

510

简单控制 xLang 窗体

260

分类专栏

xLang&xStudio

4篇

最新评论

xLang 的一些常见故障和语法问题

CSDN-Ada助手:

恭喜作者发布了第7篇博客!不断分享关于xLang 的常见故障和语法问题,对于我们这些初学者来说,真的是非常有帮助。希望作者能够继续保持创作的热情,也希望能够看到更多关于xLang 的深入学习和应用案例的分享。加油!期待您的下一篇文章!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

xLang 的一些常见故障和语法问题

用msbuild自动创建nuget软件包

简单控制 xLang 窗体

2023年3篇

2020年4篇

目录

目录

分类专栏

xLang&xStudio

4篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

IDE(6)——VS系列(6)——csproj工程文件_csproj文件怎么运行-CSDN博客

>

IDE(6)——VS系列(6)——csproj工程文件_csproj文件怎么运行-CSDN博客

IDE(6)——VS系列(6)——csproj工程文件

最新推荐文章于 2022-03-15 19:47:46 发布

陆老师Peter

最新推荐文章于 2022-03-15 19:47:46 发布

阅读量1.6k

收藏

1

点赞数

分类专栏:

IDE

文章标签:

csproj工程文件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_34573534/article/details/91365520

版权

IDE

专栏收录该内容

21 篇文章

1 订阅

订阅专栏

csproj工程文件

这里面,csproj是我们最常见的核心文件,CSharp Project,它是用于构建这个项目的工程文件。

csproj是基于xml格式的MSBuild项目文件,其仍然是文本文件,可以打开并修改定义了的工程构造的属性,比如选择性的添加或删除或修改包含在项目中的文件或引用、修改项目版本、将其转换为其它类型项目等。

MSBuild是微软定义的一个用于生成应用程序的平台(Microsoft Build Engine),在这里为VS提供了项目的构造系统,在微软官方文档上有着详细的说明:https://msdn.microsoft.com/zh-cn/library/dd393573.aspx、https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild

项目属性杂项

现在,简单说明一下csproj文件的一些核心元素。我们用vs新建一个控制台项目,然后对项目右键属性打开项目属性,在应用程序页我们可以定义:程序集名称(生成出来的程序集以程序集名称作为文件名,相当于csc中的/out)、默认命名空间(每次新建类里面显示的命名空间)、目标框架、应用程序类型、程序集信息(AssemblyInfo中的信息)、启动对象(可同时存在多个Main方法,需指定其中一个为入口对象)、程序集资源(一些可选的图标及文件)

1.在生成页有:

条件编译符号(全局的预编译#define指令,不用在每个文件头部定义,相当于csc中的/define)定义DEBUG/TRACE常量(用于调试输出的定义变量,如智能追踪的时候可以输出该变量)目标平台(指定当前面向什么处理器生成的程序集,相当于csc中的/platform。选择x86则生成的程序集生成32位程序,能在32/64位Intel处理器中使用。选择x64则生成64位,只能在64位系统中运行。选择Any CPU则32位系统生成32位,64位系统则生成64位。注意:编译平台和目标调用平台必须保持一致,否则报错。生成的32位程序集不能调用64位程序集,64位也不能调用32位)、首选32位(如果目标平台是Any CPU并且项目是应用程序类型,则生成的是32位程序集)允许不安全代码(unsafe开关,在c#中进行指针编程,如调换a方法和b方法的地址)优化代码(相当于csc中的/optimize,优化IL代码让调试难以进行,优化JIT代码)输出路径(程序集输出目录,可选择填写相对路径目录或绝对路径目录)XML文档文件(相当于csc中的/doc,为程序集生成文档注释文件,浏览对方程序集对象就可以看到相关注释,VS的智能提示技术就运用于此)为COM互操作注册(指示托管应用程序将公开一个 COM 对象,使COM对象可以与托管应用程序进行交互)

2.在高级生成设置中有:语言版本(可以选择C#版本)、调试信息(相当于csc中的/debug。选择none则不生成任何调试信息,无法调试。选择full则允许将调试器附加到运行程序,生成pdb调试文件。选择pdb-only,自.NET2.0开始与full选项完全相同,生成相同的pdb调试文件。)、文件对齐(指定输出文件中节的大小)、DLL基址(起点地址)

3.在生成事件选项中可以设置生成前和生产后执行的命令行,我们可以执行一些命令。

4.在调试选项中有一栏叫:启用Visual Studio承载进程,通过在vshost.exe中加载运行项目程序集,这个选项可以增加程序的调试性能,启用后会自动在输出目录生成{程序集名称}.vshost.exe这样一个文件,只有当当前项目不是启动项目的时候才能删除该文件。

优惠劵

陆老师Peter

关注

关注

0

点赞

1

收藏

觉得还不错?

一键收藏

知道了

0

评论

IDE(6)——VS系列(6)——csproj工程文件

csproj工程文件这里面,csproj是我们最常见的核心文件,CSharp Project,它是用于构建这个项目的工程文件。csproj是基于xml格式的MSBuild项目文件,其仍然是文本文件,可以打开并修改定义了的工程构造的属性,比如选择性的添加或删除或修改包含在项目中的文件或引用、修改项目版本、将其转换为其它类型项目等。MSBuild是微软定义的一个用于生成应用程序的平台(Mi...

复制链接

扫一扫

专栏目录

如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)

walterlv - 吕毅

03-10

5728

我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输出文件所在的位置。对于 .NET Core 所使用的新 csproj 格式来说,你可能会发现实际生成路径中带了 netcoreapp3.0 或者 net472 这样的子文件夹。

然而有时我们并不允许生成这样的子文件夹。本文将介绍可能影响实际输出路径的各种设置。

本文内容项目和输出路径影响输出路径的...

无聊的CSPROJ 文件,很无聊

dennydaniel的专栏

05-28

1389

http://schemas.microsoft.com/developer/msbuild/2003">      Debug    AnyCPU    8.0.50727    2.0    {A626B36B-DA06-4DB5-8C00-BB7A52CB2AD8}    WinExe    Properties    ReadCardv1    ReadCardv1        true

参与评论

您还未登录,请先

登录

后发表或查看评论

Visual Studio 2022 / VS2022安装文件

02-19

Visual Studio 2022 / VS2022安装文件,安装后可以直接使用哟

csproj-check:检查.csproj文件,以确保它们不引用丢失的文件

05-03

csproj检查

检查Visual Studio csproj文件中的错误。 可用作git pre-commit钩子。

安装

npm i -g csproj-check

用法

csproj-check # defaults to **/*

csproj-check a/specific/project.csproj another/project.csproj

添加Git预提交钩子

ln -s `which csproj-check` .git/hooks/pre-commit

csproj文件中copy指令的使用方式

weixin_33883178的博客

07-24

352

实际开发中有很多项目需要引用第三方的dll或者资源文件,且文件比较多,在运行时这些文件需要被拷贝到BIN目录。

使用VS自带的"复制到输出目录",似然方便,但是比较不零活,经过多次摸索,终于有了一个很好的解决办法。

将csproj中copy指令的用法如下:

1、记事本打开启动项目的 csproj文件,在 的上一行添加内容

2、保存文件,vs里面重新加载。

3、编译,验证文件是否被拷贝...

项目所需的应用程序未安装,确保已安装项目类型(.csproj)的应用程序的解决办法...

weixin_30773135的博客

08-20

45

解决方法:右键点击csproj结尾的文件,选择“属性”,“打开方式”,将其定位到vs的exe文件(如:D:"Program Files"Microsoft Visual Studio 9.0"Common7"IDE"devenv.exe)上,点击“确定”就可以了

转载于:https://www.cnblogs.com/cole2295/archive/2009/08/20/1550385.html...

VS无法读取项目文件?

weixin_33857679的博客

08-04

1497

解决无法读取项目文件"***.csproj",系统找不到指定路径以上情况可能由于2个问题出现的,1 路径不对。 2 开发工具与打开工具版本不对

解决办法:

解决路径不对:针对路径不对,我们可以用以下办法解决 用记事本打开sln文件,将绝对路径修改为相对路径就行了例如:Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "E...

.csproj 文件

热门推荐

m0_37805255的博客

08-28

1万+

.csproj 文件

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

【作用】

.csproj究竟是做什么用的?它是给开发工具用的,例如我们再熟悉不过的Visual Studio,以...

(转)Visual Studio中.sln文件和.csproj文件的区别

逝不等琴生的博客

03-11

1809

介绍

sln:solusion 解决方案

csproj:c sharp project C#项目

区别

1.解决方案是项目的集合,项目是文件的集合;一个sln中可以包含多个csproj。一个csproj可以包含多个文件;csproj可以作为单独的项目运行,也可以在sln中添加csproj统一管理。

2.sln和csproj都可以双击运行,如果解决方案中只有一个项目那么两个方式是没有区别的...

VisualStudio项目的基础文件说明

ylq1045的专栏

03-15

2107

.sln解决方案文件,本质是一个xml文件,表示该解决方案有哪些项目组成

本质是一个VB文件,我们可以选择打开方式 记事本

Microsoft Visual Studio Solution File, Format Version 12.00

# Visual Studio 15

VisualStudioVersion = 15.0.28307.421

MinimumVisualStudioVersion = 10.0.40219.1

Project("{FAE04EC0-301F-11D3-BF4

vscode-csproj:Visual Studio Code扩展,使您的csproj文件保持最新

05-16

VS Code .csproj扩展此扩展名将帮助您在使用VS Code时使csproj文件保持同步。 如果您在同时使用VS Code和Visual Studio的团队中工作,这将很有用。演示版将文件添加到项目从项目中删除文件单个文件删除多文件删除这...

Visual Studio各版本转换 支持2015.zip_VS各版本转换_csproj 转换工具_visual studio

07-15

vs版本转换器,用于2002-2015版本源码之间的相互转换,软件小巧简洁,易于使用。

VS.net VSS时,编译报错:未能向文件“.csproj.FileListAbsolute.txt”写入命令行 对路径 的访问被拒绝。

09-06

在VSS上把项目的Bin和Obj目录删除,然后重新取出项目,编译成功。

Migrator.EF6:.NET Core CLI工具,用于在Asp.Net Core应用中启用EF6迁移

03-02

使EF6迁移正常工作您可以阅读此文件末尾的发行说明。 重要提示:强烈建议您将模型和迁移放在一个纯类库项目中,该项目不依赖于任何与aspnetcore相关的东西。 除了提供更好的设计外,实际上还有一个当前问题使该工具...

IDE(10)——VS系列(10)——在VS2019中如何设置自动换行

qq_34573534的博客

07-09

1万+

工具/原料

VS2019

方法/步骤1:

比如说有这么一行代码,长度超过了编辑区的宽度。观看整行代码就需要拉动滚动条,很不方便。

方法/步骤2:

这个时候就需要设置自动换行。在VS2019上面的菜单栏中,选择 工具——>选项,弹出选项对话框。

方法/步骤3:

在对话框中,展开“文本编辑器”,然后选中“C#”,勾选右边的“自动换行“,点击“确定”按钮。

方法/步...

IDE(9)——VS系列(9)——如何设置vs2019中显示代码的行号

qq_34573534的博客

06-26

8510

1、打开vs2019,点击“工具”里的“选项”。

2、点击“选项”里的“文本编辑器”,点击“C#”,在“行号”前面打钩,点击“确定”。

3、经过以上的步骤设置好以后,就可以看到显示有行号了。

...

IDE(19)——各主流编程语言常用的IDE分别有哪些

qq_34573534的博客

04-30

4420

一、Java开发工具

1、MyEclipse(MyEclipse Enterprise Workbench)

MyEclipse应用开发平台是J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。MyEclipse应用开发平台结构上实现Eclipse单个功能部件的模块化,并可以...

IDE(1)——VS系列(1)——vs的一些操作技巧:在写代码时自动换行的设置

qq_34573534的博客

05-02

1989

有时在写代码的时候,一行代码太长了,想换行,直接按回车键的话又会报错,怎么办?其实可以这样设置vs,就可以达到自动换行的效果啦。

无法读取项目文件csproj

最新发布

09-04

无法读取项目文件csproj可能是由于以下几个原因引起的:

1. csproj文件被误删除或移动位置:如果csproj文件被意外删除或移动到其他位置,IDE就无法读取到该文件,导致无法打开项目。此时,可以尝试从回收站恢复删除的文件,或将文件移回原始位置。

2. csproj文件损坏:csproj文件是一个XML格式的文件,如果文件损坏或出现错误,IDE就无法正确解析该文件,从而无法读取项目信息。可以尝试打开csproj文件,查看是否存在错误或未闭合的标签,如果有,可以尝试修复该文件,或者使用备份文件替换。

3. 缺少必要的软件或安装包:某些IDE需要特定的软件或安装包才能正确读取和解析csproj文件,如果缺少相关的依赖项,就会导致无法读取项目文件。此时,可以检查IDE的要求并安装所需的软件或安装包。

4. IDE或工程配置错误:如果IDE或工程的配置出现错误,也可能导致无法读取csproj文件。可以尝试重新配置IDE或工程,并确保相关的设置正确。

总之,无法读取csproj文件可能是由于文件丢失、损坏、缺少依赖项或配置错误等原因引起的。根据具体情况,可以尝试修复文件、安装依赖项或重新配置工程,以解决该问题。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

陆老师Peter

CSDN认证博客专家

CSDN认证企业博客

码龄8年

暂无认证

984

原创

2万+

周排名

166万+

总排名

217万+

访问

等级

2万+

积分

886

粉丝

730

获赞

136

评论

4217

收藏

私信

关注

热门文章

AE出现已禁用刷新(要刷新视图,请释放Caps Lock)

57545

SQL中 rtrim() 函数的使用

57396

apk是什么意思以及apk里面有什么东西

56213

《非暴力沟通》全文-电子版

48204

JavaScript(18)——JavaScript汇总整理

47961

分类专栏

高中信息技术

21篇

教育/教培/IT/信息技术

26篇

软考/软考高项/PMP

47篇

《Java》

22篇

Java

6篇

CSS

29篇

网站前端开发

82篇

JS和移动互联网

52篇

C语言

33篇

DB数据库

49篇

SQL

83篇

插件体系与开发

2篇

装箱和拆箱

2篇

面向对象(C#)

3篇

【C#】面向过程

25篇

程序集(Assembly)

2篇

汉语拼音

4篇

英语

5篇

《Oracle 》

36篇

ASP.NET

78篇

《ASP.NET》

10篇

Bug处理

7篇

DotNet笔试面试题

44篇

C#

9篇

ADO.NET

66篇

XML

5篇

DOM

20篇

教材/教参/教案

4篇

试讲和说课

10篇

中职|中专|职高|技校

4篇

打印系统开发

67篇

高职|高专|大专

2篇

数据库系统概论

25篇

委托和事件

24篇

指针

1篇

配置管理

4篇

命名规范

2篇

Vue

2篇

高并发

1篇

C#语法

2篇

存储过程(Stored Procedure)

2篇

Linux入门教程

40篇

OS

8篇

操作系统

17篇

Linux

6篇

计算机基础

39篇

计算机网络

30篇

《计算机基础》

21篇

信息系统开发方法教程

10篇

信息检索系统导论

12篇

信息资源检索与利用

6篇

《Visual C#》

25篇

I/O

12篇

JQuery

35篇

反编译工具

2篇

反射

15篇

.NET

12篇

.NET Core

2篇

职称

4篇

初中信息技术

1篇

计算机组成原理

12篇

数据结构

15篇

数学

7篇

AE

71篇

Adobe

1篇

C++

30篇

IDE

21篇

计算方法

6篇

编程之路

8篇

设计模式

10篇

泛型与集合

28篇

源代码管理工具

13篇

化学

1篇

参数数组params

1篇

NuGet

3篇

API

21篇

WinForm开发

78篇

字符和字符串

14篇

HOOK钩子技术

5篇

FileStream文件流

48篇

匿名方法

3篇

内存管理

16篇

UI/GDI+

25篇

网络/连网积累

1篇

DNS

2篇

枚举

1篇

引用文件

2篇

社会

1篇

区块链

4篇

混淆/加壳/脱壳

18篇

注册机

3篇

网络安全

36篇

获取当前程序运行路径

1篇

WPF

1篇

C#常用英文单词

1篇

GitHub

2篇

算法

10篇

情感与婚恋

6篇

个人随笔

11篇

科技杂记

11篇

职场管理

3篇

职业生涯规划

8篇

业务管理

2篇

软件工具

6篇

.Net学习路线

1篇

时代大背景

大数据

3篇

序列化反序列化

2篇

服务器

5篇

报表

2篇

人脸识别

4篇

打包安装程序

3篇

项目版本号

1篇

JSON

2篇

class

struct

1篇

堆栈和堆

2篇

Socket

9篇

代码生成工具

13篇

Visio二次开发

1篇

最新评论

PDFRender4NET的使用之pdf转图片

m0_54522937:

PDFFile.Open()只能读取本地的吗,我文件在服务器上不同端口下读取不到

第6章 数据查询

风间桃子:

答案在哪里

第2章 Oracle体系结构

Shue_:

给习题不放答案等于耍流氓。

《Operating System Concepts(操作系统概念)》课程学习(3)——Chapter 3 Operating System Structures(第3章 操作系统结构)

子墨祭:

。。。抄个标题也行?

IDE(12)——VS系列(12)——使用VS创建网页

晚餐是PM:

谢谢分享,太救急了

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Scratch图形化编程——第一章:Scratch的简介

u盘用bitlocker加密后无法读取访问怎么办?

win10系统下用bitlocker加密后磁盘显示无法访问如何解决

2022年1篇

2021年36篇

2020年515篇

2019年898篇

目录

目录

分类专栏

高中信息技术

21篇

教育/教培/IT/信息技术

26篇

软考/软考高项/PMP

47篇

《Java》

22篇

Java

6篇

CSS

29篇

网站前端开发

82篇

JS和移动互联网

52篇

C语言

33篇

DB数据库

49篇

SQL

83篇

插件体系与开发

2篇

装箱和拆箱

2篇

面向对象(C#)

3篇

【C#】面向过程

25篇

程序集(Assembly)

2篇

汉语拼音

4篇

英语

5篇

《Oracle 》

36篇

ASP.NET

78篇

《ASP.NET》

10篇

Bug处理

7篇

DotNet笔试面试题

44篇

C#

9篇

ADO.NET

66篇

XML

5篇

DOM

20篇

教材/教参/教案

4篇

试讲和说课

10篇

中职|中专|职高|技校

4篇

打印系统开发

67篇

高职|高专|大专

2篇

数据库系统概论

25篇

委托和事件

24篇

指针

1篇

配置管理

4篇

命名规范

2篇

Vue

2篇

高并发

1篇

C#语法

2篇

存储过程(Stored Procedure)

2篇

Linux入门教程

40篇

OS

8篇

操作系统

17篇

Linux

6篇

计算机基础

39篇

计算机网络

30篇

《计算机基础》

21篇

信息系统开发方法教程

10篇

信息检索系统导论

12篇

信息资源检索与利用

6篇

《Visual C#》

25篇

I/O

12篇

JQuery

35篇

反编译工具

2篇

反射

15篇

.NET

12篇

.NET Core

2篇

职称

4篇

初中信息技术

1篇

计算机组成原理

12篇

数据结构

15篇

数学

7篇

AE

71篇

Adobe

1篇

C++

30篇

IDE

21篇

计算方法

6篇

编程之路

8篇

设计模式

10篇

泛型与集合

28篇

源代码管理工具

13篇

化学

1篇

参数数组params

1篇

NuGet

3篇

API

21篇

WinForm开发

78篇

字符和字符串

14篇

HOOK钩子技术

5篇

FileStream文件流

48篇

匿名方法

3篇

内存管理

16篇

UI/GDI+

25篇

网络/连网积累

1篇

DNS

2篇

枚举

1篇

引用文件

2篇

社会

1篇

区块链

4篇

混淆/加壳/脱壳

18篇

注册机

3篇

网络安全

36篇

获取当前程序运行路径

1篇

WPF

1篇

C#常用英文单词

1篇

GitHub

2篇

算法

10篇

情感与婚恋

6篇

个人随笔

11篇

科技杂记

11篇

职场管理

3篇

职业生涯规划

8篇

业务管理

2篇

软件工具

6篇

.Net学习路线

1篇

时代大背景

大数据

3篇

序列化反序列化

2篇

服务器

5篇

报表

2篇

人脸识别

4篇

打包安装程序

3篇

项目版本号

1篇

JSON

2篇

class

struct

1篇

堆栈和堆

2篇

Socket

9篇

代码生成工具

13篇

Visio二次开发

1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

c# - What does the .csproj file do? - Stack Overflow

c# - What does the .csproj file do? - Stack Overflow

Stack Overflow

About

Products

For Teams

Stack Overflow

Public questions & answers

Stack Overflow for Teams

Where developers & technologists share private knowledge with coworkers

Talent

Build your employer brand

Advertising

Reach developers & technologists worldwide

Labs

The future of collective knowledge sharing

About the company

Loading…

current community

Stack Overflow

help

chat

Meta Stack Overflow

your communities

Sign up or log in to customize your list.

more stack exchange communities

company blog

Log in

Sign up

Home

Questions

Tags

Users

Companies

Labs

Discussions

New

Collectives

Explore Collectives

Teams

Stack Overflow for Teams

– Start collaborating and sharing organizational knowledge.

Create a free Team

Why Teams?

Teams

Create free Team

Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Get early access and see previews of new features.

Learn more about Labs

What does the .csproj file do?

Ask Question

Asked

12 years, 8 months ago

Modified

2 years, 11 months ago

Viewed

78k times

90

Usually a C# project has a .csproj file associated with it. What is that file for? What data does it contain?

c#visual-studioprojectfile-extensioncsproj

Share

Improve this question

Follow

edited Jun 8, 2020 at 10:19

one noa

35911 gold badge33 silver badges1010 bronze badges

asked Jun 22, 2011 at 20:47

MirceaMircea

3,40966 gold badges2727 silver badges2626 bronze badges

Add a comment

 | 

5 Answers

5

Sorted by:

Reset to default

Highest score (default)

Trending (recent votes count more)

Date modified (newest first)

Date created (oldest first)

79

Basically the .csproj file contains the list of files in your project, plus the references to system assemblies etc.

There are a whole bunch of settings - Visual Studio version, project type, Assembly name, Application Icon, Target Culture, Installation Url,...

Everything you need to build your project. While you could assume that you need everything in the current folder, having an explicit list allows you to organise them logically both on the disk and in the project so you can more easily find the files you want.

It's just XML so you can open it in your favourite text editor and take a look.

You get one .csproj file per assembly and the .sln (solution file) ties together all the assemblies that make up your project.

Share

Improve this answer

Follow

edited Jun 22, 2011 at 20:56

answered Jun 22, 2011 at 20:49

ChrisF♦ChrisF

136k3131 gold badges258258 silver badges329329 bronze badges

1

Could you suggest suggest some sources for this?

– Shad

Aug 21, 2023 at 8:00

Add a comment

 | 

13

Updated for .NET 5

This is the most important file in our application. It tells .NET how to build the project.

All .NET projects list their dependencies in the .csproj file. If you have worked with JavaScript before, think of it like a package.json file. The difference is, instead of a JSON, this is an XML file. When you run dotnet restore, it uses this file to figure out which NuGet packages to download and copy to the project folder.

The .csproj file also contains all the information that .NET tooling needs to build the project. It includes the type of the project being built (console, web, desktop, etc.), the platform this project targets and any dependencies on other projects or 3rd party libraries.

Starting in .NET 5, there have been a few major changes to make this file easier to read and maintain, which are listed below.

In the older versions of .NET, every file in the project had to be listed in the .csproj file. Now they are automatically included and compiled.**

Previously, GUIDs were used everywhere. Now they are used rarely.

The path to the DLL files was included, but starting .NET 5, you don't need to specify the path on the disk.

Example:

net5.0

Note: If you are using Visual Studio, this file will be hidden, but you can right-click on the project and choose edit the project file.

Share

Improve this answer

Follow

edited Apr 12, 2021 at 6:22

answered Jan 13, 2021 at 9:48

software_writersoftware_writer

4,1191010 gold badges3939 silver badges6565 bronze badges

Add a comment

 | 

11

The file contains a list of all the files to be compiled as part of the project, as well as other options like the project name, release and debug configurations, compilation options, and so on.

Share

Improve this answer

Follow

answered Jun 22, 2011 at 20:49

Brennan VincentBrennan Vincent

10.9k99 gold badges3434 silver badges5757 bronze badges

Add a comment

 | 

8

Taken from What is .csproj file?

".csproj" is a Visual Studio .NET C# Project file extension. This file will have information about the files included in that project, assemblies used in that project, project GUID and project version etc. This file is related to your project. It will be automatically generated when we create

".sln" is a structure for organizing projects in Visual Studio. It contains the state information for projects in .sln (text-based, shared) and .suo (binary, user-specific solution options) files. We can add multiple projects inside one solution.

Share

Improve this answer

Follow

edited May 6, 2020 at 10:11

Pang

9,733146146 gold badges8282 silver badges123123 bronze badges

answered Jun 22, 2011 at 21:02

RahulRahul

77k1313 gold badges7474 silver badges128128 bronze badges

Add a comment

 | 

1

It contains information about all the files used in the project, assemblies used(including the path for other then provided assemblies), output type, assembly name and much more.So, by opening this xml, you can find all the info in under one roof.

Share

Improve this answer

Follow

edited Jun 9, 2016 at 9:21

CommunityBot

111 silver badge

answered Aug 10, 2012 at 11:15

mrkmrk

15111 silver badge44 bronze badges

0

Add a comment

 | 

Your Answer

Reminder: Answers generated by artificial intelligence tools are not allowed on Stack Overflow. Learn more

Thanks for contributing an answer to Stack Overflow!Please be sure to answer the question. Provide details and share your research!But avoid …Asking for help, clarification, or responding to other answers.Making statements based on opinion; back them up with references or personal experience.To learn more, see our tips on writing great answers.

Draft saved

Draft discarded

Sign up or log in

Sign up using Google

Sign up using Facebook

Sign up using Email and Password

Submit

Post as a guest

Name

Email

Required, but never shown

Post as a guest

Name

Email

Required, but never shown

Post Your Answer

Discard

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged c#visual-studioprojectfile-extensioncsproj or ask your own question.

The Overflow Blog

Building GenAI features in practice with Intuit Mailchimp

A leading ML educator on what you need to know about LLMs

Upcoming Events

2024 Community Moderator Election

ends in 3 days

Featured on Meta

Our partnership with Google and commitment to socially responsible AI

Shifting the data dump schedule: A proposal

Temporary policy: Generative AI (e.g., ChatGPT) is banned

Linked

3

What is the difference between the .build, the .csproj and .metaproj files? What's their purpose?

1

Difference between .csproj and .msbuild files?

-1

C# missing assembly.cs App.Config and Program.cs

Related

205

In a .csproj file, what is for?

2

csproj file in solution explorer

2

What is a csdproj file?

212

What is "Service Include" in a csproj file for?

94

What are .CSX C# files for?

1

Difference between .csproj and .msbuild files?

3

What's purpose of element in .csproj file?

1

What is a .psproj file?

0

How .cs-files detected for inclusion in the new .csproj SDK format?

0

understanding the content of a csproj file

Hot Network Questions

Find the center of all circles that touch the x-axis and a circle around the origin

Heavy Workload and Many Hats, but No Communication and No Clear Expectations?

Is it safe to connect AC earth to DC negative?

Why do red dwarf (M-type) stars give off such violent flares and CMEs, out of proportion to their size and temperature?

Finding offset of a filesystem in LVM relative to beginning of a drive

Replacing a compact fluorescent bulb in a bathroom exhaust fan with an LED bulb?

problems in a good topology (subdivision)

Conceal passwords in configuration files but maintain password length

If an edge e doesn't belong to any mst, then what can we say about e?

Is there an API that lets me hold flight bookings for free for 7 days with verifiable PNR?

Why is "programming" so much prioritized in a computer science degree?

Short story about a futuristic civilization that had no concept of there being a wider universe, and the ramifications of them discovering it?

Leaving US via land border with expired visa/ESTA: What if you can't enter?

FizzBuzz on a List of Numbers

Applications of Categorical Logic to Logic

Do northern areas in Pakistan have electricity and Internet?

Why "time part" represents energy in Four-momentum?

What event, short of a war or apocalypse, could cause social and technological regress?

Is there any benefit in allowing foreign lobbying in a country?

Received a verbal offer via videoconferencing - how long to wait for initial written offer?

How to recover implicit arguments of inductive types in a match expression?

Did Jesus want John to reference Isaiah 35:4-6, and recognize the miracles as proof of His divinity?

Does the existence of humans increase the plausibility of other kinds of designers?

What's this vintage diode(?) from the 1970s?

more hot questions

Question feed

Subscribe to RSS

Question feed

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

lang-cs

Stack Overflow

Questions

Help

Products

Teams

Advertising

Collectives

Talent

Company

About

Press

Work Here

Legal

Privacy Policy

Terms of Service

Contact Us

Cookie Settings

Cookie Policy

Stack Exchange Network

Technology

Culture & recreation

Life & arts

Science

Professional

Business

API

Data

Blog

Facebook

Twitter

LinkedIn

Instagram

Site design / logo © 2024 Stack Exchange Inc; user contributions licensed under CC BY-SA. rev 2024.3.8.5973

初学C#,总结一下.sln和.csproj的区别 - ProZkb - 博客园

初学C#,总结一下.sln和.csproj的区别 - ProZkb - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

Prozkb

堆栈(Stack)就是栈

select OrderSn from ORDER_Tracking group by OrderSn having count(1)>=2

HttpClient httpclient = new HttpClient();

var ret = httpclient.GetAsync("https://www.baidu.com/");

var Content = ret.Result.Content.ReadAsStringAsync().Result;

UTF-8编码的文字可以在各国各种支持UTF-8字符集的浏览器上显示

博客园

首页

新随笔

联系

订阅

管理

初学C#,总结一下.sln和.csproj的区别

1、sln:solusion 解决方案

csproj:c sharp project C#项目

csproj文件大家应该不会陌生,那就是C#项目文件的扩展名,它是“C Sharp Project”的缩写

2、解决方案是项目的集合,项目是文件的集合;一个sln中可以包含多个csproj。一个csproj可以包含多个文件;csproj可以作为单独的项目运行,也可以在sln中添加csproj统一管理。

3、sln和csproj都可以双击运行,如果解决方案中只有一个项目那么两个方式是没有区别的;

但是如果一个解决方案中包含多个项目,sln会加载该解决方案中所有的项目,而csproj只会加载当前项目。

4、关于sln和csproj的几个问题

(1)、c#.net中.sln的文件可以删掉重新生成吗?这样会有问题吗?

.sln是项目文件。删除后项目的一些设置会无法恢复,因为你的解决方案里面可能有关于这个项目的文件的很多信息,所以一般不建议删除重建;但一般也没有太大的问题,你用VS直接打开.csproj工程文件,会给你建上sln的。你把需要的工程再一个一个的加进来就好了。

(2)、下载的Asp.net源码没有.sln 或.csproj 文件如何使用啊?

从Visual Studio

IDE的菜单“文件”》“打开”》“网站”,然后从右边的目录中选择你要打开的网站目录,不需要有.sln文件就可以打开网站并调试运行。如果是WebSite模式那么是不需要SLN文件的,可以通过File->WebSite->OpenWebSite打开。

如果不是WebSite模式,那么可以自己建立一个空项目,然后把文件Copy进去即可。

人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。

posted @

2017-11-23 19:50 

ProZkb 

阅读(8862) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

公告

Copyright © 2024 ProZkb

Powered by .NET 8.0 on Kubernetes