namespace Microsoft.Build.Tasks.Xaml { using System; using System.Globalization; using System.Runtime; using System.Runtime.Remoting.Lifetime; using XamlBuildTask; internal static class XamlBuildTaskLeaseLifetimeHelper { const string RemotingLeaseLifetimeInMinutesEnvironmentVariableName = "XamlBuildTaskTimeoutInMinutes"; // In order to take advantage of the XamlBuildTaskRemotingLeaseLifetimeInMinutes environment variable from an MSBuild // project file (e.g. csproj file), the following needs to be added to that project file: // // After the initial " // // // // // // System.Environment.SetEnvironmentVariable(Name, Value); // // // // And at the end of the project file, before the closing : // // // // // // // // // This example uses a task name of "MySetEnv", but it that name could be anything desired. // It also sets the timeout to 24 minutes, as defined as the Value specified to the MySetEnv task. // The AfterBuild target is not required, but is probably desired so that the environment variable setting // does not persist after the processing of this particular project file. // The valid values for the environment variable are numbers between 1 and 2147483647 inclusive // (positive 32-bit integers). Any other value will result in no change to the lease lifetime. internal static void SetLeaseLifetimeFromEnvironmentVariable(ILease lease) { // We can only change the lease lifetime if we have an ILease and it is still in the Initial state. if ((lease != null) && (lease.CurrentState == LeaseState.Initial)) { try { string remotingLeaseLifetimeInMinutesStringValue = Environment.GetEnvironmentVariable(RemotingLeaseLifetimeInMinutesEnvironmentVariableName); if (!string.IsNullOrEmpty(remotingLeaseLifetimeInMinutesStringValue)) { int remotingLeaseLifetimeInMinutes = -1; if (Int32.TryParse(remotingLeaseLifetimeInMinutesStringValue, NumberStyles.Integer, CultureInfo.InvariantCulture, out remotingLeaseLifetimeInMinutes)) { // revert to the defauilt if the number specified is less than or equal to 0. if (remotingLeaseLifetimeInMinutes > 0) { lease.InitialLeaseTime = TimeSpan.FromMinutes(remotingLeaseLifetimeInMinutes); lease.RenewOnCallTime = TimeSpan.FromMinutes(remotingLeaseLifetimeInMinutes); } } } } catch (Exception ex) { // simply ignore any exceptions that might have occurred and go with the default. We can't log it because // we aren't initialized enough at this point. if (Fx.IsFatal(ex)) { throw; } } } } } }