您可以使用手写的C#、脚本、PowerShell或类似方法来进行搜索和替换正则表达式,但会有以下问题:
- 难以阅读(在三个月或更长时间内阅读您的漂亮正则表达式)
- 难以增强(为新的搜索/替换/检查功能编写新的正则表达式)
- 易于破坏(新版本/格式的ms build项目或未预测的标记可能无法工作)
- 较难进行测试(必须检查没有意外匹配发生)
- 难以维护(因为上述原因)
还有以下优点:
- 不执行任何额外的验证,这可能使其适用于任何类型的项目(mono或visual)。
- 不关心\r :)
最好的方法是使用Microsoft.Build.Evaluation 并构建一个C#工具,它可以完成所有的测试/检查/修复等操作。
我已经完成了一个
命令行工具,它使用一个源文件列表(由Mono使用)并更新csproj的源文件,另外还可以在控制台上输出csproj内容。这很容易做到,非常直接和易于测试。
然而,它可能会失败(就像我经历过的那样),因为被“非”Ms工具修改的项目(如Mono Studio)或缺少
\r。无论如何,你总是可以通过异常捕获和良好的消息来处理它。
这里有一个使用Microsoft.Build.dll的示例(不要使用Microsof.Build.Engine,因为它已经过时了):
using System;
using Microsoft.Build.Evaluation;
internal class Program
{
private static void Main(string[] args)
{
var project = new Project("PathToYourProject.csproj");
Console.WriteLine(project.GetProperty("TargetFrameworkVersion", true, string.Empty));
Console.WriteLine(project.GetProperty("Platform", true, string.Empty));
Console.WriteLine(project.GetProperty("WarningLevel", true, string.Empty));
Console.WriteLine(project.GetProperty("TreatWarningsAsErrors", true, "false"));
Console.WriteLine(project.GetProperty("OutputPath", false, string.Empty));
Console.WriteLine(project.GetProperty("SignAssembly", true, "false"));
Console.WriteLine(project.GetProperty("AssemblyName", false, string.Empty));
Console.ReadLine();
}
}
public static class ProjectExtensions
{
public static string GetProperty(this Project project, string propertyName, bool afterEvaluation, string defaultValue)
{
var property = project.GetProperty(propertyName);
if (property != null)
{
if (afterEvaluation)
return property.EvaluatedValue;
return property.UnevaluatedValue;
}
return defaultValue;
}
}
Microsoft.Build.Evaluation
命名空间中的类来编写工具,例如C#来完成此任务。 - stijn