在Visual Studio中使用外部工具进行C#构建

5
使用Visual Studio 2008时,您可以使用内部工具构建C++项目,而不是让IDE直接调用MSVC。如果使用跨平台构建系统,则可以提高跨平台构建的一致性。
然而,我无法找出如何对C#项目执行相同操作。将其简单地注册为带有C#源的本机项目是可行的,但是这样会失去通过拥有C#项目获得的某些优势。更重要的是,这意味着允许项目直接构建和使用外部工具(这是必需的)将需要两个单独的项目,而不仅仅是创建一个替代构建配置来调用外部工具。
是否有人知道如何防止Visual Studio自己调用csc,而是调用外部工具?
编辑:显然存在一些误解。这里的目标不是在Visual Studio之外编译任何内容。相反,它允许Visual Studio作为IDE但不是构建系统。已经有一个(基于Scons的)构建系统能够编译C#和C ++源代码,并且已经配置了Visual Studio以调用Scons来编译C ++项目。我正在尝试配置它,以便在单击“Build”按钮时,它将对C#项目和C ++项目都调用Scons。

请看我在下面答案中的修改。 - Achilles
1
你是否尝试在 MSDN 论坛上发布这个问题?那里更熟悉 VS 及其限制的人可以尝试解决这个问题。 - Jason D
没有,谢谢你的建议。 - coppro
8个回答

6

编辑:如果您只是想在IDE之外编译,仍然可以使用MSBuild来回答您的问题。IDE(Visual Studios)只是一种“花哨”的构建文件的方式,这些文件由MSBuild构建。 Visual Studios并没有构建文件,它只是调用随.NET Framework 2.0及更高版本一起提供的MSBuild来编译您基于创建的项目文件的代码。如果Scons可以读取和处理MSBuild文件,那么我相信您可以调用它来构建您的项目。但考虑到C#是一种Microsoft语言,我认为如果不使用MSBuild,您将很难找到增值点,因为我认为语言和构建工具都经过了很好的协调。

您可以使用MSBuild来编译您的C#项目。如果您在文本编辑器中打开.csproj文件,您将看到它是一个MSBuild文件。如果您想在IDE之外编写一些C#代码,您可以使用.csproj文件作为起点构建一个构建文件,并调用MSBuild来编译您的应用程序。 IDE只是一种抽象出MSBuild文件编辑的方式。

如果您非常勤奋,可以创建一组自定义任务来执行自定义构建过程中的操作,例如移动文件和版本控制。 MSBuild Community Tasks是使用自定义代码执行MSBuild任务的绝佳示例。


我并不是在寻找一种完全在IDE之外编译的方法。我正在尝试点击IDE内部的“编译”按钮,并让它调用Scons。对于C++,我可以使用Makefile项目来实现这一点。现在使用Scons进行构建已经可以正常工作了,我只是在寻找IDE集成。 - coppro

5

除了其他答案之外,当VS或MSBuild执行构建操作时,MSBuild的作用可以在随.Net一起交付的目标文件中找到。这些文件可以在系统上的FrameWork目录中找到。在我的情况下:

C:\Windows\Microsoft.NET\Framework64\v3.5

包含Microsoft.Common.targets等文件。此文件包含以下代码片段:

<!--
============================================================
                                    Build

The main build entry point.
============================================================
-->
<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>
<Target
    Name="Build"
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
    DependsOnTargets="$(BuildDependsOn)"
    Outputs="$(TargetPath)"/>

这意味着重新定义此目标,您可以使MSBuild和VS做任何您想要的事情。提到文件的顶部包含了一个重要的信息:
Microsoft.Common.targets

WARNING:  DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
          created a backup copy.  Incorrect changes to this file will make it
          impossible to load or build your projects from the command-line or the IDE.

This file defines the steps in the standard build process for .NET projects.  It
contains all the steps that are common among the different .NET languages, such as
Visual Basic, C#, and Visual J#.

我的建议是尽可能多地阅读有关MSBuild及其构建文件语法的内容,尝试重新定义项目中的Build目标。我认为,在了解MSBuild后,您可能会发现更简单的方式来满足您的要求。您可以在这个问题的一个答案中找到重新定义目标的示例。

编辑:

如何重新定义目标? 重新定义实质上是在已定义相同目标之后再次定义。因此,在您的.*proj文件中,在导入所有所需目标以构建C#项目的<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />行之后定义一个Build Task。例如:

<Target
    Name="Build"
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
    DependsOnTargets="BeforeBuild"
    Outputs="$(TargetPath)">
    <Exec Command="nmake" />
</Target>

我有点困惑。我该如何重新定义它以使其执行不同的操作? - coppro

2
我在同一方向上找到了一个问题这里,其中建议编辑注册表。 我相当确定没有其他方法可以更改Visual Studio使用的编译器,因为在任何解决方案,配置,csproj文件或其他文件中都没有csc.exe的痕迹,也没有在Program Files目录中的Visual Studio 9.0文件夹/子文件夹中找到它。

注册表位置可以在以下位置找到:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\74ACAA9F1F0087E4882A06A5E18D7D32
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components\9055DA7481CC1024CB23A6109FD8FC9B

但是这些键可能因您的安装而异。结论:更改VS使用的编译器似乎几乎不可能。
补充说明:以下MSDN文章处理了一个自定义C ++编译器的相同问题,Ed Dore的答案似乎证实了我的理论,即没有办法选择在VS中使用自定义编译器。

啊,非常有用的信息,接近我所寻找的,但不完全是 - 我并不是真的想要替换编译器;而是告诉 MSVC 不要使用它(如果这有意义的话)。 - coppro
根据您在Achilles的帖子中的评论,我了解到您想在单击VS中的构建选项时调用Scons。我怀疑除了在注册表中使用外部命令替换csc.exe之外,您是否还能做到这一点。因此,您的评论对我来说没有太多意义;)。 - Webleeuw

0

编辑您的项目文件,更新CscToolPath键以指向包含您的工具的目录,并添加CscToolExe键,该键保存目录的名称:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|.NET 3.5' ">
   .
   .
   .
   <CscToolPath>path\to\custom\tool\directory</CscToolPath>
   <CscToolExe>exe name</CscToolExe>
   .
   .
   .
</PropertyGroup>

我还没有测试过这个,而且CscToolExe键可能会引起问题,在这种情况下,我希望将外部工具的可执行文件重命名为“csc.exe”。


虽然我喜欢那个建议,但那不是一个选项。如果你传递了所有的csc标志给SCons,它会心脏病发作。 - coppro
在这种情况下,也许一个自定义的 .targets 文件,它将使用您想要的参数调用 SCons,会起作用吗?您可以以 CSharp 为基础,在项目文件中更改导入为您的自定义 .targets 文件: - Oded

0
在“工具”>“外部工具”下,您应该能够定义一个外部工具来为您执行活动。命令应该是指向您外部工具的可执行文件的路径。
希望这能对您有所帮助。

这个不会很好地与其他系统集成,比如调试器。 - coppro

0

0

你可以通过命令行来构建你的解决方案,方法如下:

C:\WINDOWS\Microsoft.NET\Framework\v3.5>msbuild.exe "C:\path\Your Solution.sln"

在发布之前,你有阅读coppro的评论和其他答案吗?他说他不是在寻找在VS外编译的方法,而是想要在VS内部替换对csc.exe的调用。 - Webleeuw

0

通过查阅答案,我觉得将scons与Visual Studio集成起来并与调试器兼容等是不可能实现的......

你可以考虑的一个选择,我知道你不想改变构建系统,但请耐心听我说,那就是使用一个meta-build系统,即“cmake”。http://www.cmake.org/

CMake实际上并不构建项目。它创建了构建文件,而你可以使用这些文件来构建项目。在Windows上,它为你创建的构建文件是:Visual Studio工程文件。你只需直接将其加载到IDE中编译和使用即可!

我认为CMake非常易于使用,并提供了高度的透明度和可维护性。

相同的CMakeLists.txt文件在Linux上会生成Linux makefiles。

在mingw上,它们可以生成mingw makefiles。

CMake内部有许多可用的生成器。列表在此处:

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#section_Generators

http://springrts.com 是一个巨大的开源实时战略游戏,它曾经使用 scons 作为其跨平台构建系统,现在则使用 cmake。

我知道您不想改变构建系统,因此这是一个中长期的解决方案。

无论如何,Cmake 是另一个选择,可以添加到使用自定义构建工具、使用 msbuild 或手动从命令行运行 scons 构建等选项之一。


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