自定义MSBuild之Task示例
除了MSBuild自身提供的各项Task(任务),每个项目还可以定义自己的Task。自定义的Task可以通过UsingTask在MSBuild的project中使用。
在Tech Ed课程中得到演示的一个MSBuild Custom Task完成很简单的任务:从RawScoreFile中读取Tech Ed课程评分并计算平均值。因为这个演示不是Tech Ed课程的主要内容(我并没有MSBuild的课程),所以届时没有时间显示代码,而请参考本Blog的内容。
用VS2005创建一个新的Class Library的项目叫做TechEdCourseEvalution,增加对Microsoft.Build.Framework和Microsoft.Build.Utilities的引用(Reference),删除VS2005自动加入的源文件,增加一个新类叫做CountAverage.其内容如下:
using System;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
![]()
namespace Microsoft.TechEdCn.Demo
...{
public sealed class CountAverage : Task
...{
public override bool Execute()
...{
bool executeSuccessful = false;
this.Log.LogMessage(MessageImportance.Normal, "Tech Ed 2005 China Course Evaluation");
string fileName = this.rawScoreFile.ItemSpec;
![]()
if (!System.IO.File.Exists(fileName))
...{
executeSuccessful = false;
Log.LogError("RawScoreFile Does Not Exisit. Task Aborted.");
}
else
...{
int numberOfEvaluations = 0;
int totalScores = 0;
int score;
![]()
string[] scoreLines = System.IO.File.ReadAllLines(fileName);
foreach (string scoreLine in scoreLines)
...{
if (!(Int32.TryParse(scoreLine, out score)))
...{
Log.LogWarning("Invalid Format : {0}", scoreLine);
}
else if (score <= 0 || score > 9)
...{
Log.LogWarning("Invalid Score: {0}", score);
}
else
...{
numberOfEvaluations++;
totalScores += score;
}
}
![]()
if (numberOfEvaluations == 0)
...{
this.Log.LogError("Nobody submitted evaluation. Task Aborted.");
executeSuccessful = false; //unnecessary, but better explicit
}
else
...{
double average = (double)totalScores / (double)numberOfEvaluations;
if (average > 8.88)
...{
this.Log.LogMessage(MessageImportance.High, "Congratulations on your score: {0:N2}", average);
}
AverageScore = average;
executeSuccessful = true;
}
}
return executeSuccessful;
}
![]()
[Required]
public ITaskItem RawScoreFile
...{
get
...{
return rawScoreFile;
}
set
...{
rawScoreFile = value;
}
}
![]()
private ITaskItem rawScoreFile;
![]()
private double averageScore;
![]()
[Output]
public double AverageScore
...{
get ...{ return averageScore; }
set ...{ averageScore = value; }
}
}
}
posted on 2005-09-04 19:49:00 by zhanbos 评论(14) 阅读(3656)




}
}