1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
public class SignTask : Task
{
[Required]
public string WorkingDirectory
{
get;
set;
}
[Required]
public ITaskItem[] Files
{
get;
set;
}
public string AdditionalOptions
{
get;
set;
}
protected string GenerateCommandLineCommands()
{
CommandLineBuilder builder = new CommandLineBuilder(false);
builder.AppendSwitch("sign");
if(AdditionalOptions != null)
{
builder.AppendTextUnquoted(" ");
builder.AppendTextUnquoted(AdditionalOptions);
}
builder.AppendFileNamesIfNotNull(Files, " ");
return builder.ToString();
}
public override bool Execute()
{
string commandLineCommands = GenerateCommandLineCommands();
int status = 0;
string output = "";
string error = "";
int nRetries = 0;
while(nRetries++ < 10)
{
output = "";
error = "";
status = RunCommand(WorkingDirectory, "signtool.exe", commandLineCommands, ref output, ref error);
if(status != 0 && error.IndexOf("timestamp server") != -1)
{
Thread.Sleep(10);
continue;
}
break;
}
if(status == 0)
{
Log.LogMessage(MessageImportance.High, output.Trim());
}
else
{
Log.LogError(error.Trim());
}
return status == 0;
}
public class StreamReader
{
public string Output { get; private set; }
public string Error { get; private set; }
public void ouput(object sendingProcess, DataReceivedEventArgs outLine)
{
if(outLine.Data != null)
{
Output += outLine.Data + "\n";
}
}
public void error(object sendingProcess, DataReceivedEventArgs outLine)
{
if(outLine.Data != null)
{
Error += outLine.Data + "\n";
}
}
}
public static int RunCommand(string workingDir, string command, string args, ref string output, ref string error)
{
Process process = new Process();
process.StartInfo.FileName = command;
process.StartInfo.Arguments = args;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.WorkingDirectory = workingDir;
var streamReader = new StreamReader();
process.OutputDataReceived += new DataReceivedEventHandler(streamReader.ouput);
process.ErrorDataReceived += new DataReceivedEventHandler(streamReader.error);
try
{
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
error = streamReader.Error;
output = streamReader.Output;
return process.ExitCode;
}
catch(Exception ex)
{
error = ex.ToString();
return 1;
}
}
}
|