<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask
    TaskName="HeaderFromHexdump"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
    <ParameterGroup>
        <RawFilePath Required="true" />
        <HeaderFilePath Required="true" />
        <SourceHeader Required="true" />
        <SourceFooter Required="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System"/>
      <Using Namespace="System.IO"/>
      <Code Type="Fragment" Language="cs">
<![CDATA[
Log.LogMessage("msbuild inline hexdump task for " + RawFilePath + ".");
if(File.Exists(RawFilePath) == false) {
    Log.LogError("hexdump task could not locate " + RawFilePath + ".");
}
else {
    FileInfo inFileInfo = new FileInfo(RawFilePath);
    FileInfo outFileInfo = new FileInfo(HeaderFilePath);

    if (outFileInfo.Exists == false || inFileInfo.LastWriteTime > outFileInfo.LastWriteTime)
    {
      using (Stream inStm = File.OpenRead(RawFilePath))
      {
          using (StreamWriter sw = new StreamWriter(HeaderFilePath))
          {
              sw.WriteLine(SourceHeader);
              int count = 0;
              int rawChar = inStm.ReadByte();
              while(rawChar != -1)
              {
                  sw.Write("0x{0:x2}, ", rawChar);
                  count++;
                  if(count % 8 == 0)
                  {
                      sw.WriteLine();
                  }
                  rawChar = inStm.ReadByte();
              }
              sw.WriteLine(SourceFooter);
          }
      }
   }
}
]]>
      </Code>
    </Task>
  </UsingTask>
</Project>