如何配置解决方案中所有C#项目

9

我有一个包含许多C#项目的解决方案,如何快速更改所有项目的配置,比如我想将输出文件夹从bin更改为MyBin。我知道C++属性表可以做类似的事情,但C#没有属性表。

我有一个解决方案,其中包含许多C#项目,如何快速更改所有项目的配置,例如我想将输出文件夹从bin更改为MyBin。我知道C++属性表可以做类似的事情,但是C#没有属性表。

4
你可以搜索并替换所有的csproj文件。 - Nick
这是我的问题的标准解决方案吗? - S Ding
1
是的...因为这确实没有用户界面。.NET传统就是使用binobj目录。 - Roy Dictus
你只需要更改入口程序集,所有引用都会在构建时复制到依赖的 bin 文件夹中(除非你另有指定)。 - Gusdor
输出文件夹只是一个示例,我可能还想更改其他值,如.NET框架版本等。 - S Ding
3个回答

7
你可以使用一个常见的“部分”项目文件来存储共同的内容。
将所有想要同时更改的内容移动到一个独立的 .proj 文件中,例如 common.proj:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
    <OutputPath>Debug</OutputPath>
    <Platform>AnyCPU</Platform>
  </PropertyGroup>
</Project>

然后,使用msbuild的导入声明将公共部分“包含”到解决方案中的每个项目中:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="common.proj" />
</Project>

MsBuild的导入方式与C++的包含方式基本相同:在构建项目之前,所有的导入指令都会被替换为导入文件的内容。现在,你可以在一个文件common.proj中更改你的公共属性。

需要注意一点:Visual Studio会缓存已经包含的项目文件,因此当你对common.proj文件进行更改后,你需要重新加载所有的项目(所以我建议在你主动更改commom.proj时从命令行执行构建)。

我们使用这种方法来管理代码分析设置(因为它们应该在解决方案中的所有项目中保持一致)。


非常感谢您的帮助! - S Ding

3
您需要定义一个新的“构建配置”,可以从“发布”或“调试”中复制,也可以全部手动构建。之后,您可以为每个项目定制其选项,“关于您刚创建的自定义构建”的选项,然后完成。这只需进行一次即可。之后,每当您选择该自定义构建时,解决方案中每个单独项目选择的所有属性都将设置为您想要的属性。 enter image description here

如果我理解楼主的意思正确的话,他不想逐个项目地进行配置,而是希望一次性地配置所有项目。 - Moo-Juice
@Moo-Juice:是的。但这是一种方法来做到这一点。你只需要在解决方案中为每个项目执行一次,然后在一切正常之后,只需在不同的配置选项之间切换即可。 - Tigran
1
Tigran - 是的,这是一种方式,但只有当你想限制自己在VS UI时才是如此。如果你不在意并且了解VS项目和MSBuild之间的关系,你就不需要这样做,而且会有一整套新选项向你敞开。默认情况下,VS UI提供的并不总是最好的,有时必须进行一些定制。实际上这很容易。 - quetzalcoatl

1
  • 依次右键单击解决方案中的所有项目。
  • 在每个项目上点击“卸载”。
  • 然后再次对它们所有进行“编辑XXX.csproj”操作。

现在,许多XML文件将以文本文件形式打开。

现在使用查找和替换功能(如果使用默认快捷键,则为control-shift-H),并设置:

  • 查找内容:OutputPath>bin\Debug</OutputPath>
  • 替换为:MyBin\Debug
  • 查找范围:所有打开的文档

然后点击全部替换

接下来,对bin\ReleaseMyBin\Release也做同样的操作。

然后保存所有XML文件,然后右键单击每个项目并选择“重新加载”。

您可以在任何文本编辑器或任何命令行查找和替换工具(如sed)中执行相同操作。如果有,请使用它们-这将使您免受右键单击/卸载所有项目的麻烦。

您还可以利用CSPROJs只是MSBuild文件的事实,因此可以创建一个“配置”MSBuild脚本,该脚本将包含每个C#项目,并定义额外的变量,如“公共输出路径”等。但是,尽管这肯定有效(我已经做了几次),但最有可能会以最自然的方式破坏VS UI中的一些PropertySheets,例如,如果您使用此来覆盖/设置OutputPaths,则VS UI将显示空或损坏的输出路径,并尝试使用VS UI进行更正/更改将反过来覆盖从公共配置文件中读取它们的智能设置。显而易见,不是吗。
编辑:在这里快速解释了Partial .csproj Files,但请务必阅读下面的评论。

非常感谢您的回复。我知道如何通过编辑xml项目文件来更改配置,也知道如何在VS GUI中更改它们。我想要实现的是修改一个简单的值,然后所有使用该值的项目都将被更改,例如,我最初为所有项目使用.NET框架4.0,现在我想使用4.5。 - S Ding
唯一的方法就像我已经说过的那样 - 使用MSBuild在.csproj文件中的“import”指令。您将创建一个额外的“半项目”文件,该文件将设置一些常见属性,然后每个项目都将“包含”该特殊文件。请参阅此线程:https://dev59.com/tnVC5IYBdhLWcg3w4VRz 注意并特别注意他们所说的“最派生”的文件。如果projectA包括projectB,projectB包括projectC,并且projectD也包括projectC,则您应该将projectA和projectD附加到VS IDE中的解决方案中。 - quetzalcoatl
请注意:额外的projectB和projectC无需以.csproj结尾。您可以“包含”任何正确的XML / MSBuild格式文件。这意味着您可以使用不同的名称并将它们作为XML文件包含在解决方案中,但不能作为项目,而应该作为简单的XML文件。这样会使编辑它们变得更加容易。但是,您仍然必须非常小心:除非重新加载solution/projectA/projectD,否则VS IDE通常不会注意到对这些额外文件所做的任何更改。幸运的是,这只是IDE问题。 “生成”选项始终会正确读取所有内容。 - quetzalcoatl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接