Hi,
I have the following scenario. We use stored procedures to access the database and we use LiNQ 2 SQL to generate the classes or namely we use Unplugged LINQ to SQL Generator for this. It has been run as a custom tool but diffing the generated classes is a big pain in the neck. We would like to auto generate the classes but exclude it from version control so I set on the task of creating an msbuild task. Found this post and this post but I can't solve this one by myself. I added some code the task looks like the following:
public class GenerateDesignerDC : Task
{
public ITaskItem[] InputFiles { get; set; }
public ITaskItem[] OutputFiles { get; set; }
public override bool Execute()
{
var generatedFileNames = new List<string>();
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;
}
}
Now I try to add a custom target for this called custom.target
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CoreCompileDependsOn>$(CoreCompileDependsOn);GenerateToolOutput</CoreCompileDependsOn>
</PropertyGroup>
<UsingTask TaskName="BuildTasks.GenerateDesignerDC" AssemblyFile="BuildTasks.dll" />
<Target Name="GenerateToolOutput" Inputs="@(dbml)" Outputs="@(dbml->'$(IntermediateOutputPath)%(FileName).designer.cs')">
<GenerateDesignerDC InputFiles="@(dbml)" OutputFiles="@(dbml->'$(IntermediateOutputPath)%(FileName).designer.cs')">
<Output ItemGroup="Compile" TaskParameter="OutputFiles" />
</GenerateDesignerDC>
</Target>
</Project>
I also add the necessary ItemGroups to the project file like follows:
<ItemGroup>
<AvailableItemName Include="dbml" />
</ItemGroup>
<ItemGroup>
<Compile Include="@(dbml)" />
</ItemGroup>
And finally I add the files to the project with the following:
<dbml Include="DAL\SettingsDC.dbml">
<SubType>Designer</SubType>
<Generator>ULinqToSQLGenerator</Generator>
<LastGenOutput>SettingsDC.designer.cs</LastGenOutput>
</dbml>
This causes an error message saying
The "GenerateDesignerDC" task has an invalid output specification. The "TaskParameter" attribute is required, and either the "ItemName" or "PropertyName" attribute must be specified (but not both).
What do I need to do to make this work?