如何在 C# 中快速处理 csproj 文件

Posted

技术标签:

【中文标题】如何在 C# 中快速处理 csproj 文件【英文标题】:How do i Quickly Process a csproj file in c# 【发布时间】:2020-02-14 15:47:23 【问题描述】:

我正在制作一个预编译器,这意味着它将读取大量文件并处理一些自定义预处理器指令。但无论我在网上看多少,我都找不到 .csproj 文件的工作处理器。我可以阅读它们并提取数据。但我无法处理它们以使用配置和平台参数提取状态。

我的意思是,如果我有一个 csproj,它在 DEBUG 构建和其他在 RELEASE 构建上添加了一些预处理器指令,我希望能够处理该文件,以便在我构建 DEBUG 时正确得到所有然后定义的预处理器,同样用于 RELEASE 构建。

我将具体处理 dotnet 核心项目。

【问题讨论】:

所以您想在预构建阶段识别编译器指令和构建配置? @TroyPalacino,基本上是的,我想在使用平台和配置处理所有条件后获取文件状态。这包括 OutputPath、AllowUnsafe、BuildTargets 等内容。 【参考方案1】:

我想在处理完所有条件后使用 平台和配置。这包括诸如 OutputPath 之类的东西, AllowUnsafe、BuildTargets 等。

c# 编译器与 c++ 编译器不同,它没有像 PreprocessorDefinitions 这样的编译器专用的特定预编译指令项元素。

作为建议,您可以尝试在xxxx.csproj 文件中添加自定义target 以执行some msbuild task 进行一些预处理。而您想在pre-build 目标之后执行所有这些操作,您可以将AfterTargets="PrepareForBuild" 设置为此自定义目标,这意味着它在PrepareForBuild 目标之后运行。

建议

就像这样:

<Target Name="CustomPreprocessor" AfterTargets="PrepareForBuild">

<Message Importance="high" Text="$(OutputPath)--$(AllowUnsafeBlocks)--$(PrepareForBuildDependsOn)" ></Message>

 ........//other msbuild task

 </Target>

1)如果想以配置为条件,根据DebugRelease执行不同的前置指令,可以使用@987654323 @。 如果你想使用Debug,可以参考这个:

<Target Name="CustomPreprocessor" AfterTargets="PrepareForBuild" Condition=" '$(Configuration)' == 'Debug' ">

同时,如果你还想添加palform作为并行条件,请试试这个:

 <Target Name="CustomPreprocessor" AfterTargets="PrepareForBuild" Condition=" '$(Configuration)' == 'Debug' and '$(Platform)' =='Any CPU' ">

2) 由于outputpathAllowUnsafe 是MSBuild 属性,您可以使用$(outputpath)$(AllowUnsafeBlocks) 来获取它们的值,而您可以使用@(...) 来获取@ 的值987654324@.

3) 基本上,要在target中执行一个预指令,你可以用一个任务来完成,你可以参考this document添加任何你想做的任何操作的任务。 p>

【讨论】:

如果我误解了您的问题,请随时告诉我们。 恐怕你不太明白我想做什么,我正在创建一个预处理器来摄取 c# 文件并处理自定义预处理器指令,我想做的是添加对 MSBuild 的支持configs 意味着它将读取 .csproj 文件并在解析配置和平台时提取构建的状态。如果我可以使用目标执行程序并解析所有 MSBuild 指令,那么这将有所帮助。我可以在目标内做到这一点吗? 如果你想在 c# 编译器csc.exe 下创建一个自定义预处理器或者只是一个新的编译器,我认为你可以通过编码来扩展 MSBuild。你可以创建一个新的控制台项目ctcode,通过nuget继承Microsoft.Build.Tasks和Microsoft.Build.Framework,然后创建一个自定义的build.exe引擎来构建你的项目。 另外,MSBuild 的代码是开源的。你可以参考它(github link),然后根据需要进行修改。 谢谢,我已经想通了,是的,我的计划是在使用 VS 时环绕构建引擎,这样,如果 MSBuild 得到更新,我的代码仍然可以处理对构建器的任何更改/编译器。

以上是关于如何在 C# 中快速处理 csproj 文件的主要内容,如果未能解决你的问题,请参考以下文章

C# vs2010如何实现在一个类(.cs文件)下面又有很多个.cs文件?

C# 2008 Express:此版本的应用程序不支持项目类型 (.csproj)

初学C#,总结一下.sln和.csproj的区别

如何在 JetBrains Rider 中添加 C# 解决方案文件?

如何在我的新CSPROJ类库中包含带有本机dll的NuGet包?

如何在 csproj 文件中获取环境变量?