如何在 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)如果想以配置为条件,根据Debug
或Release
执行不同的前置指令,可以使用@987654323 @。
如果你想使用Debug
,可以参考这个:
<Target Name="CustomPreprocessor" AfterTargets="PrepareForBuild" Condition=" '$(Configuration)' == 'Debug' ">
同时,如果你还想添加palform作为并行条件,请试试这个:
<Target Name="CustomPreprocessor" AfterTargets="PrepareForBuild" Condition=" '$(Configuration)' == 'Debug' and '$(Platform)' =='Any CPU' ">
2) 由于outputpath
和AllowUnsafe
是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)
如何在 JetBrains Rider 中添加 C# 解决方案文件?