MSBuild,自定义任务运行自定义工具生成linq到sql模型的类?

我有以下情况。 我们使用存储过程来访问数据库,我们使用LiNQ 2 SQL来生成类,或者我们使用Unplugged LINQ to SQL Generator来实现此目的。 它已经作为自定义工具运行,但是对生成的类进行区分是一个巨大的痛苦。 我们想自动生成类但是将它从版本控制中排除,所以我开始创建一个msbuild任务。 发现这篇文章和这篇文章,但我不能自己解决这个问题。 我添加了一些代码,任务如下所示:

public class GenerateDesignerDC : Task { public ITaskItem[] InputFiles { get; set; } public ITaskItem[] OutputFiles { get; set; } public override bool Execute() { var generatedFileNames = new List(); foreach (var task in InputFiles) { string inputFileName = task.ItemSpec; string outputFileName = Path.ChangeExtension(inputFileName, ".Designer.cs"); string result; // Build code string var generator = new ULinqCodeGenerator("CSharp"); string fileContent; using (FileStream fs = File.OpenRead(inputFileName)) using (StreamReader rd = new StreamReader(fs)) { fileContent = rd.ReadToEnd(); } using (var destination = new FileStream(outputFileName, FileMode.Create)) { byte[] bytes = Encoding.UTF8.GetBytes(generator.BuildCode(inputFileName, fileContent)); destination.Write(bytes, 0, bytes.Length); } generatedFileNames.Add(outputFileName); } OutputFiles = generatedFileNames.Select(name => new TaskItem(name)).ToArray(); return true; } } 

现在我尝试为这个名为custom.target的人添加一个自定义目标

   $(CoreCompileDependsOn);GenerateToolOutput   '$(IntermediateOutputPath)%(FileName).designer.cs')"> '$(IntermediateOutputPath)%(FileName).designer.cs')">     

我还将必要的ItemGroups添加到项目文件中,如下所示:

       

最后,我使用以下内容将文件添加到项目中:

  Designer ULinqToSQLGenerator SettingsDC.designer.cs  

这会导致出现错误消息

“GenerateDesignerDC”任务具有无效的输出规范。 “TaskParameter”属性是必需的,必须指定“ItemName”或“PropertyName”属性(但不能同时指定两者)。

我需要做些什么来完成这项工作?

您尚未在任务中声明输出属性。 您必须在OutputFiles属性上使用Output属性。

 public class GenerateDesignerDC : Task { [Required] public ITaskItem[] InputFiles { get; set; } [Output] public ITaskItem[] OutputFiles { get; set; } public override bool Execute() { var generatedFileNames = new List(); foreach (var task in InputFiles) { string inputFileName = task.ItemSpec; string outputFileName = Path.ChangeExtension(inputFileName, ".Designer.cs"); string result; // Build code string var generator = new ULinqCodeGenerator("CSharp"); string fileContent; using (FileStream fs = File.OpenRead(inputFileName)) using (StreamReader rd = new StreamReader(fs)) { fileContent = rd.ReadToEnd(); } using (var destination = new FileStream(outputFileName, FileMode.Create)) { byte[] bytes = Encoding.UTF8.GetBytes(generator.BuildCode(inputFileName, fileContent)); destination.Write(bytes, 0, bytes.Length); } generatedFileNames.Add(outputFileName); } OutputFiles = generatedFileNames.Select(name => new TaskItem(name)).ToArray(); return true; } }