Style updates (#735)

pull/736/head
Next Turn 2020-12-09 00:48:19 +08:00 committed by GitHub
parent 820f46e6bf
commit 1bd0c56a09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 261 additions and 288 deletions

View File

@ -62,7 +62,7 @@ namespace WinSW.Configuration
public bool Interactive => false;
// Logging
public Log Log { get => new LogDefaults(); }
public Log Log => new LogDefaults();
public string LogDirectory => DefaultLogSettings.Directory;
@ -76,7 +76,7 @@ namespace WinSW.Configuration
public string ErrFilePattern => this.Log.ErrFilePattern;
public ServiceAccount ServiceAccount => new ServiceAccount()
public ServiceAccount ServiceAccount => new()
{
ServiceAccountName = null,
ServiceAccountDomain = null,
@ -108,13 +108,13 @@ namespace WinSW.Configuration
public override int? Period => 1;
public override bool OutFileDisabled { get => false; }
public override bool OutFileDisabled => false;
public override bool ErrFileDisabled { get => false; }
public override bool ErrFileDisabled => false;
public override string OutFilePattern { get => ".out.log"; }
public override string OutFilePattern => ".out.log";
public override string ErrFilePattern { get => ".err.log"; }
public override string ErrFilePattern => ".err.log";
public override string? AutoRollAtTime => null;
@ -125,9 +125,9 @@ namespace WinSW.Configuration
}
// Environment
public List<Download> Downloads => new List<Download>(0);
public List<Download> Downloads => new(0);
public Dictionary<string, string> EnvironmentVariables => new Dictionary<string, string>(0);
public Dictionary<string, string> EnvironmentVariables => new(0);
// Misc
public bool BeepOnShutdown => false;
@ -135,7 +135,7 @@ namespace WinSW.Configuration
// Extensions
public XmlNode? ExtensionsConfiguration => null;
public List<YamlExtensionConfiguration>? YamlExtensionsConfiguration => new List<YamlExtensionConfiguration>(0);
public List<YamlExtensionConfiguration>? YamlExtensionsConfiguration => new(0);
public string BaseName
{
@ -160,7 +160,7 @@ namespace WinSW.Configuration
}
}
public List<string> ExtensionIds => new List<string>(0);
public List<string> ExtensionIds => new(0);
public string? SecurityDescriptor => null;
}

View File

@ -78,7 +78,7 @@ namespace WinSW.Configuration
if (this.AutoRollAtTime != null)
{
// validate it
if (!TimeSpan.TryParse(this.AutoRollAtTime, out TimeSpan autoRollAtTimeValue))
if (!TimeSpan.TryParse(this.AutoRollAtTime, out var autoRollAtTimeValue))
{
throw new InvalidDataException("Roll-Size-Time Based rolling policy is specified but autoRollAtTime does not match the TimeSpan format HH:mm:ss found in configuration XML.");
}

View File

@ -288,9 +288,7 @@ namespace WinSW.Configuration
if (!int.TryParse(this.ZipOlderThanNumDaysYamlLog, out int zipolderthannumdaysValue))
{
// FIXME: Remove the build env specific warning suppression from the codebase
#pragma warning disable S2372 // Exceptions should not be thrown from property getters
throw new InvalidDataException("Roll-Size-Time Based rolling policy is specified but zipOlderThanNumDays does not match the int format found in configuration XML.");
#pragma warning restore S2372 // Exceptions should not be thrown from property getters
}
zipolderthannumdays = zipolderthannumdaysValue;
@ -356,7 +354,7 @@ namespace WinSW.Configuration
return AuthType.None;
}
var auth = ExpandEnv(this.AuthYamlDownload);
string auth = ExpandEnv(this.AuthYamlDownload);
try
{
@ -388,7 +386,7 @@ namespace WinSW.Configuration
{
get
{
SC_ACTION_TYPE actionType = this.FailureAction switch
var actionType = this.FailureAction switch
{
"restart" => SC_ACTION_TYPE.SC_ACTION_RESTART,
"none" => SC_ACTION_TYPE.SC_ACTION_NONE,
@ -493,7 +491,7 @@ namespace WinSW.Configuration
return this.Defaults.StartMode;
}
var p = ExpandEnv(this.StartModeYaml);
string p = ExpandEnv(this.StartModeYaml);
try
{
@ -516,7 +514,7 @@ namespace WinSW.Configuration
{
get
{
var args = this.GetArguments(this.ArgumentsYaml, ArgType.Arg);
string? args = this.GetArguments(this.ArgumentsYaml, ArgType.Arg);
return args is null ? this.Defaults.Arguments : args;
}
}
@ -572,7 +570,7 @@ namespace WinSW.Configuration
return this.Defaults.Priority;
}
var p = ExpandEnv(this.PriorityYaml);
string p = ExpandEnv(this.PriorityYaml);
try
{
@ -604,7 +602,7 @@ namespace WinSW.Configuration
var result = new List<string>(0);
foreach (var item in this.ServiceDependenciesYaml)
foreach (string item in this.ServiceDependenciesYaml)
{
result.Add(ExpandEnv(item));
}
@ -638,8 +636,8 @@ namespace WinSW.Configuration
continue;
}
var key = item.Name;
var value = ExpandEnv(item.Value);
string key = item.Name;
string value = ExpandEnv(item.Value);
this.EnvironmentVariables[key] = value;
Environment.SetEnvironmentVariable(key, value);

View File

@ -150,10 +150,10 @@ namespace WinSW
public void Perform()
#endif
{
WebRequest request = WebRequest.Create(this.From);
var request = WebRequest.Create(this.From);
if (!string.IsNullOrEmpty(this.Proxy))
{
CustomProxyInformation proxyInformation = new CustomProxyInformation(this.Proxy!);
var proxyInformation = new CustomProxyInformation(this.Proxy!);
if (proxyInformation.Credentials != null)
{
request.Proxy = new WebProxy(proxyInformation.ServerAddress, false, null, proxyInformation.Credentials);
@ -196,12 +196,12 @@ namespace WinSW
try
{
#if VNEXT
using (WebResponse response = await request.GetResponseAsync())
using (var response = await request.GetResponseAsync())
#else
using (WebResponse response = request.GetResponse())
using (var response = request.GetResponse())
#endif
using (Stream responseStream = response.GetResponseStream())
using (FileStream tmpStream = new FileStream(tmpFilePath, FileMode.Create))
using (var responseStream = response.GetResponseStream())
using (var tmpStream = new FileStream(tmpFilePath, FileMode.Create))
{
if (supportsIfModifiedSince)
{

View File

@ -27,7 +27,7 @@ namespace DynamicProxy
private const string ModuleName = "ProxyModule";
private const string HandlerName = "handler";
private static readonly Dictionary<string, Type> TypeCache = new Dictionary<string, Type>();
private static readonly Dictionary<string, Type> TypeCache = new();
private static readonly AssemblyBuilder AssemblyBuilder =
#if VNEXT
@ -57,26 +57,26 @@ namespace DynamicProxy
private static Type CreateType(string dynamicTypeName, Type[] interfaces)
{
Type objType = typeof(object);
Type handlerType = typeof(IProxyInvocationHandler);
var objType = typeof(object);
var handlerType = typeof(IProxyInvocationHandler);
TypeAttributes typeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
var typeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
// Gather up the proxy information and create a new type builder. One that
// inherits from Object and implements the interface passed in
TypeBuilder typeBuilder = ModuleBuilder.DefineType(
var typeBuilder = ModuleBuilder.DefineType(
dynamicTypeName, typeAttributes, objType, interfaces);
// Define a member variable to hold the delegate
FieldBuilder handlerField = typeBuilder.DefineField(
var handlerField = typeBuilder.DefineField(
HandlerName, handlerType, FieldAttributes.Private | FieldAttributes.InitOnly);
// build a constructor that takes the delegate object as the only argument
ConstructorInfo baseConstructor = objType.GetConstructor(Type.EmptyTypes)!;
ConstructorBuilder delegateConstructor = typeBuilder.DefineConstructor(
var baseConstructor = objType.GetConstructor(Type.EmptyTypes)!;
var delegateConstructor = typeBuilder.DefineConstructor(
MethodAttributes.Public, CallingConventions.Standard, new Type[] { handlerType });
ILGenerator constructorIL = delegateConstructor.GetILGenerator();
var constructorIL = delegateConstructor.GetILGenerator();
// Load "this"
constructorIL.Emit(OpCodes.Ldarg_0);
@ -98,7 +98,7 @@ namespace DynamicProxy
// for every method that the interfaces define, build a corresponding
// method in the dynamic type that calls the handlers invoke method.
foreach (Type interfaceType in interfaces)
foreach (var interfaceType in interfaces)
{
GenerateMethod(interfaceType, handlerField, typeBuilder);
}
@ -118,17 +118,17 @@ namespace DynamicProxy
private static void GenerateMethod(Type interfaceType, FieldBuilder handlerField, TypeBuilder typeBuilder)
{
MethodInfo[] interfaceMethods = interfaceType.GetMethods();
var interfaceMethods = interfaceType.GetMethods();
for (int i = 0; i < interfaceMethods.Length; i++)
{
MethodInfo methodInfo = interfaceMethods[i];
var methodInfo = interfaceMethods[i];
// Get the method parameters since we need to create an array
// of parameter types
ParameterInfo[] methodParams = methodInfo.GetParameters();
var methodParams = methodInfo.GetParameters();
int numOfParams = methodParams.Length;
Type[] methodParameters = new Type[numOfParams];
var methodParameters = new Type[numOfParams];
// convert the ParameterInfo objects into Type
for (int j = 0; j < numOfParams; j++)
@ -137,14 +137,14 @@ namespace DynamicProxy
}
// create a new builder for the method in the interface
MethodBuilder methodBuilder = typeBuilder.DefineMethod(
var methodBuilder = typeBuilder.DefineMethod(
methodInfo.Name,
/*MethodAttributes.Public | MethodAttributes.Virtual | */ methodInfo.Attributes & ~MethodAttributes.Abstract,
CallingConventions.Standard,
methodInfo.ReturnType,
methodParameters);
ILGenerator methodIL = methodBuilder.GetILGenerator();
var methodIL = methodBuilder.GetILGenerator();
// invoke target: IProxyInvocationHandler
methodIL.Emit(OpCodes.Ldarg_0);
@ -196,7 +196,7 @@ namespace DynamicProxy
}
// Iterate through the parent interfaces and recursively call this method
foreach (Type parentType in interfaceType.GetInterfaces())
foreach (var parentType in interfaceType.GetInterfaces())
{
GenerateMethod(parentType, handlerField, typeBuilder);
}

View File

@ -140,8 +140,8 @@ namespace WinSW.Extensions
private void LoadExtensionFromXml(string id)
{
XmlNode? extensionsConfig = this.ServiceDescriptor.ExtensionsConfiguration;
XmlElement? configNode = extensionsConfig is null ? null : extensionsConfig.SelectSingleNode("extension[@id='" + id + "'][1]") as XmlElement;
var extensionsConfig = this.ServiceDescriptor.ExtensionsConfiguration;
var configNode = extensionsConfig is null ? null : extensionsConfig.SelectSingleNode("extension[@id='" + id + "'][1]") as XmlElement;
if (configNode is null)
{
throw new ExtensionException(id, "Cannot get the configuration entry");
@ -151,7 +151,7 @@ namespace WinSW.Extensions
if (descriptor.Enabled)
{
IWinSWExtension extension = this.CreateExtensionInstance(descriptor.Id, descriptor.ClassName);
var extension = this.CreateExtensionInstance(descriptor.Id, descriptor.ClassName);
extension.Descriptor = descriptor;
try
{
@ -187,7 +187,7 @@ namespace WinSW.Extensions
if (descriptor.Enabled)
{
IWinSWExtension extension = this.CreateExtensionInstance(descriptor.Id, descriptor.ClassName);
var extension = this.CreateExtensionInstance(descriptor.Id, descriptor.ClassName);
extension.Descriptor = descriptor;
try
@ -237,7 +237,7 @@ namespace WinSW.Extensions
className = "WinSW.Plugins.SharedDirectoryMapper";
}
Type? t = Type.GetType(className);
var t = Type.GetType(className);
if (t is null)
{
throw new ExtensionException(id, "Class " + className + " does not exist");

View File

@ -107,7 +107,7 @@ namespace WinSW
}
}
protected StreamWriter CreateWriter(FileStream stream) => new StreamWriter(stream) { AutoFlush = true };
protected StreamWriter CreateWriter(FileStream stream) => new(stream) { AutoFlush = true };
protected abstract void LogOutput(StreamReader outputReader);
@ -200,10 +200,10 @@ namespace WinSW
/// </summary>
private void CopyStreamWithDateRotation(StreamReader reader, string ext)
{
PeriodicRollingCalendar periodicRollingCalendar = new PeriodicRollingCalendar(this.Pattern, this.Period);
var periodicRollingCalendar = new PeriodicRollingCalendar(this.Pattern, this.Period);
periodicRollingCalendar.Init();
StreamWriter writer = this.CreateWriter(new FileStream(this.BaseLogFileName + "_" + periodicRollingCalendar.Format + ext, FileMode.Append));
var writer = this.CreateWriter(new FileStream(this.BaseLogFileName + "_" + periodicRollingCalendar.Format + ext, FileMode.Append));
string? line;
while ((line = reader.ReadLine()) != null)
{
@ -259,7 +259,7 @@ namespace WinSW
/// </summary>
private void CopyStreamWithRotation(StreamReader reader, string ext)
{
StreamWriter writer = this.CreateWriter(new FileStream(this.BaseLogFileName + ext, FileMode.Append));
var writer = this.CreateWriter(new FileStream(this.BaseLogFileName + ext, FileMode.Append));
long fileLength = new FileInfo(this.BaseLogFileName + ext).Length;
string? line;
@ -383,20 +383,20 @@ namespace WinSW
private void CopyStreamWithRotation(StreamReader reader, string extension)
{
// lock required as the timer thread and the thread that will write to the stream could try and access the file stream at the same time
var fileLock = new object();
object fileLock = new object();
var baseDirectory = Path.GetDirectoryName(this.BaseLogFileName)!;
var baseFileName = Path.GetFileName(this.BaseLogFileName);
var logFile = this.BaseLogFileName + extension;
string baseDirectory = Path.GetDirectoryName(this.BaseLogFileName)!;
string baseFileName = Path.GetFileName(this.BaseLogFileName);
string logFile = this.BaseLogFileName + extension;
var writer = this.CreateWriter(new FileStream(logFile, FileMode.Append));
var fileLength = new FileInfo(logFile).Length;
long fileLength = new FileInfo(logFile).Length;
// We auto roll at time is configured then we need to create a timer and wait until time is elasped and roll the file over
if (this.AutoRollAtTime is TimeSpan autoRollAtTime)
{
// Run at start
var tickTime = this.SetupRollTimer(autoRollAtTime);
double tickTime = this.SetupRollTimer(autoRollAtTime);
var timer = new System.Timers.Timer(tickTime);
timer.Elapsed += (s, e) =>
{
@ -408,8 +408,8 @@ namespace WinSW
writer.Dispose();
var now = DateTime.Now.AddDays(-1);
var nextFileNumber = this.GetNextFileNumber(extension, baseDirectory, baseFileName, now);
var nextFileName = Path.Combine(baseDirectory, string.Format("{0}.{1}.#{2:D4}{3}", baseFileName, now.ToString(this.FilePattern), nextFileNumber, extension));
int nextFileNumber = this.GetNextFileNumber(extension, baseDirectory, baseFileName, now);
string nextFileName = Path.Combine(baseDirectory, string.Format("{0}.{1}.#{2:D4}{3}", baseFileName, now.ToString(this.FilePattern), nextFileNumber, extension));
File.Move(logFile, nextFileName);
writer = this.CreateWriter(new FileStream(logFile, FileMode.Create));
@ -445,8 +445,8 @@ namespace WinSW
{
// roll file
var now = DateTime.Now;
var nextFileNumber = this.GetNextFileNumber(extension, baseDirectory, baseFileName, now);
var nextFileName = Path.Combine(
int nextFileNumber = this.GetNextFileNumber(extension, baseDirectory, baseFileName, now);
string nextFileName = Path.Combine(
baseDirectory,
string.Format("{0}.{1}.#{2:D4}{3}", baseFileName, now.ToString(this.FilePattern), nextFileNumber, extension));
File.Move(logFile, nextFileName);
@ -574,21 +574,21 @@ namespace WinSW
private int GetNextFileNumber(string ext, string baseDirectory, string baseFileName, DateTime now)
{
var nextFileNumber = 0;
var files = Directory.GetFiles(baseDirectory, string.Format("{0}.{1}.#*{2}", baseFileName, now.ToString(this.FilePattern), ext));
int nextFileNumber = 0;
string[] files = Directory.GetFiles(baseDirectory, string.Format("{0}.{1}.#*{2}", baseFileName, now.ToString(this.FilePattern), ext));
if (files.Length == 0)
{
nextFileNumber = 1;
}
else
{
foreach (var f in files)
foreach (string f in files)
{
try
{
var filenameOnly = Path.GetFileNameWithoutExtension(f);
var hashIndex = filenameOnly.IndexOf('#');
var lastNumberAsString = filenameOnly.Substring(hashIndex + 1, 4);
string filenameOnly = Path.GetFileNameWithoutExtension(f);
int hashIndex = filenameOnly.IndexOf('#');
string lastNumberAsString = filenameOnly.Substring(hashIndex + 1, 4);
if (int.TryParse(lastNumberAsString, out int lastNumber))
{
if (lastNumber > nextFileNumber)

View File

@ -16,7 +16,7 @@ namespace WinSW.Logging
protected override void Append(LoggingEvent loggingEvent)
{
EventLog? eventLog = this.Provider.Locate();
var eventLog = this.Provider.Locate();
// We write the event iff the provider is ready
eventLog?.WriteEntry(loggingEvent.RenderedMessage, ToEventLogEntryType(loggingEvent.Level));

View File

@ -9,7 +9,7 @@ namespace WinSW.Native
{
internal static void AddServiceLogonRight(string domain, string user)
{
IntPtr sid = GetAccountSid(domain, user);
var sid = GetAccountSid(domain, user);
try
{
@ -34,8 +34,8 @@ namespace WinSW.Native
string accountName = domain + "\\" + user;
_ = LookupAccountName(null, accountName, IntPtr.Zero, ref sidSize, IntPtr.Zero, ref domainNameLength, out _);
IntPtr sid = Marshal.AllocHGlobal(sidSize);
IntPtr domainName = Marshal.AllocHGlobal(domainNameLength * sizeof(char));
var sid = Marshal.AllocHGlobal(sidSize);
var domainName = Marshal.AllocHGlobal(domainNameLength * sizeof(char));
try
{
@ -54,7 +54,7 @@ namespace WinSW.Native
private static void AddAccountRight(IntPtr sid, string rightName)
{
uint status = LsaOpenPolicy(IntPtr.Zero, default, PolicyAccess.ALL_ACCESS, out IntPtr policyHandle);
uint status = LsaOpenPolicy(IntPtr.Zero, default, PolicyAccess.ALL_ACCESS, out var policyHandle);
if (status != 0)
{
throw new Win32Exception(LsaNtStatusToWinError(status));
@ -62,7 +62,7 @@ namespace WinSW.Native
try
{
LSA_UNICODE_STRING userRight = new LSA_UNICODE_STRING
var userRight = new LSA_UNICODE_STRING
{
Buffer = rightName,
Length = (ushort)(rightName.Length * sizeof(char)),

View File

@ -54,7 +54,7 @@ namespace WinSW.Native
internal static ServiceManager Open()
{
IntPtr handle = OpenSCManager(null, null, ServiceManagerAccess.ALL_ACCESS);
var handle = OpenSCManager(null, null, ServiceManagerAccess.ALL_ACCESS);
if (handle == IntPtr.Zero)
{
Throw.Win32Exception("Failed to open the service control manager database.");
@ -65,7 +65,7 @@ namespace WinSW.Native
internal Service OpenService(string serviceName)
{
IntPtr serviceHandle = ServiceApis.OpenService(this.handle, serviceName, ServiceAccess.ALL_ACCESS);
var serviceHandle = ServiceApis.OpenService(this.handle, serviceName, ServiceAccess.ALL_ACCESS);
if (serviceHandle == IntPtr.Zero)
{
Throw.Win32Exception("Failed to open the service.");

View File

@ -7,7 +7,7 @@ namespace WinSW.Native
{
internal static void Win32Exception(string message)
{
Win32Exception inner = new Win32Exception();
var inner = new Win32Exception();
Debug.Assert(inner.NativeErrorCode != 0);
Debug.Assert(message.EndsWith("."));
throw new Win32Exception(inner.NativeErrorCode, message + ' ' + inner.Message);

View File

@ -40,15 +40,15 @@ namespace WinSW
private Periodicity DeterminePeriodicityType()
{
PeriodicRollingCalendar periodicRollingCalendar = new PeriodicRollingCalendar(this.format, this.period);
DateTime epoch = new DateTime(1970, 1, 1);
var periodicRollingCalendar = new PeriodicRollingCalendar(this.format, this.period);
var epoch = new DateTime(1970, 1, 1);
foreach (Periodicity i in ValidOrderedList)
foreach (var i in ValidOrderedList)
{
string r0 = epoch.ToString(this.format);
periodicRollingCalendar.PeriodicityType = i;
DateTime next = periodicRollingCalendar.NextTriggeringTime(epoch, 1);
var next = periodicRollingCalendar.NextTriggeringTime(epoch, 1);
string r1 = next.ToString(this.format);
if (r0 != r1)
@ -91,7 +91,7 @@ namespace WinSW
{
get
{
DateTime now = DateTime.Now;
var now = DateTime.Now;
if (now > this.nextRoll)
{
this.currentRoll = now;

View File

@ -16,10 +16,7 @@ namespace WinSW
/// </summary>
public class ServiceDescriptor : IWinSWConfiguration
{
#pragma warning disable S2755 // XML parsers should not be vulnerable to XXE attacks
protected readonly XmlDocument dom = new XmlDocument();
#pragma warning restore S2755 // XML parsers should not be vulnerable to XXE attacks
protected readonly XmlDocument dom = new();
private readonly Dictionary<string, string> environmentVariables;
public static DefaultWinSWSettings Defaults { get; } = new DefaultWinSWSettings();
@ -84,9 +81,7 @@ namespace WinSW
public static ServiceDescriptor FromXML(string xml)
{
#pragma warning disable S2755 // XML parsers should not be vulnerable to XXE attacks
var xmlDom = new XmlDocument();
#pragma warning restore S2755 // XML parsers should not be vulnerable to XXE attacks
xmlDom.LoadXml(xml);
return new ServiceDescriptor(xmlDom);
}
@ -98,7 +93,7 @@ namespace WinSW
private string? SingleElement(string tagName, bool optional)
{
XmlNode? n = this.dom.SelectSingleNode("//" + tagName);
var n = this.dom.SelectSingleNode("//" + tagName);
if (n is null && !optional)
{
throw new InvalidDataException("<" + tagName + "> is missing in configuration XML");
@ -109,14 +104,14 @@ namespace WinSW
private bool SingleBoolElement(string tagName, bool defaultValue)
{
XmlNode? e = this.dom.SelectSingleNode("//" + tagName);
var e = this.dom.SelectSingleNode("//" + tagName);
return e is null ? defaultValue : bool.Parse(e.InnerText);
}
private int SingleIntElement(XmlNode parent, string tagName, int defaultValue)
{
XmlNode? e = parent.SelectSingleNode(tagName);
var e = parent.SelectSingleNode(tagName);
return e is null ? defaultValue : int.Parse(e.InnerText);
}
@ -153,7 +148,7 @@ namespace WinSW
return arguments;
}
XmlNode? argumentsNode = this.dom.SelectSingleNode("//arguments");
var argumentsNode = this.dom.SelectSingleNode("//arguments");
return argumentsNode is null ? Defaults.Arguments : Environment.ExpandEnvironmentVariables(argumentsNode.InnerText);
}
@ -173,7 +168,7 @@ namespace WinSW
return startArguments;
}
XmlNode? startArgumentsNode = this.dom.SelectSingleNode("//startarguments");
var startArgumentsNode = this.dom.SelectSingleNode("//startarguments");
return startArgumentsNode is null ? null : Environment.ExpandEnvironmentVariables(startArgumentsNode.InnerText);
}
@ -193,7 +188,7 @@ namespace WinSW
return stopArguments;
}
XmlNode? stopArgumentsNode = this.dom.SelectSingleNode("//stoparguments");
var stopArgumentsNode = this.dom.SelectSingleNode("//stoparguments");
return stopArgumentsNode is null ? null : Environment.ExpandEnvironmentVariables(stopArgumentsNode.InnerText);
}
@ -203,7 +198,7 @@ namespace WinSW
{
get
{
var wd = this.SingleElement("workingdirectory", true);
string? wd = this.SingleElement("workingdirectory", true);
return string.IsNullOrEmpty(wd) ? Defaults.WorkingDirectory : wd!;
}
}
@ -212,14 +207,14 @@ namespace WinSW
{
get
{
XmlNode? argumentNode = this.ExtensionsConfiguration;
XmlNodeList? extensions = argumentNode?.SelectNodes("extension");
var argumentNode = this.ExtensionsConfiguration;
var extensions = argumentNode?.SelectNodes("extension");
if (extensions is null)
{
return new List<string>(0);
}
List<string> result = new List<string>(extensions.Count);
var result = new List<string>(extensions.Count);
for (int i = 0; i < extensions.Count; i++)
{
result.Add(XmlHelper.SingleAttribute<string>((XmlElement)extensions[i]!, "id"));
@ -237,15 +232,15 @@ namespace WinSW
/// </summary>
private string? AppendTags(string tagName, string? defaultValue = null)
{
XmlNode? argumentNode = this.dom.SelectSingleNode("//" + tagName);
var argumentNode = this.dom.SelectSingleNode("//" + tagName);
if (argumentNode is null)
{
return defaultValue;
}
StringBuilder arguments = new StringBuilder();
var arguments = new StringBuilder();
XmlNodeList argumentNodeList = this.dom.SelectNodes("//" + tagName)!;
var argumentNodeList = this.dom.SelectNodes("//" + tagName)!;
for (int i = 0; i < argumentNodeList.Count; i++)
{
arguments.Append(' ');
@ -276,7 +271,7 @@ namespace WinSW
/// <summary>
/// LogDirectory is the service wrapper executable directory or the optionally specified logpath element.
/// </summary>
public string LogDirectory { get => this.Log.Directory; }
public string LogDirectory => this.Log.Directory;
public string LogMode
{
@ -285,7 +280,7 @@ namespace WinSW
string? mode = null;
// first, backward compatibility with older configuration
XmlElement? e = (XmlElement?)this.dom.SelectSingleNode("//logmode");
var e = (XmlElement?)this.dom.SelectSingleNode("//logmode");
if (e != null)
{
mode = e.InnerText;
@ -308,19 +303,13 @@ namespace WinSW
{
get
{
XmlNode? loggingName = this.dom.SelectSingleNode("//logname");
var loggingName = this.dom.SelectSingleNode("//logname");
return loggingName is null ? this.BaseName : Environment.ExpandEnvironmentVariables(loggingName.InnerText);
}
}
public Log Log
{
get
{
return new XmlLogSettings(this);
}
}
public Log Log => new XmlLogSettings(this);
private class XmlLogSettings : Log
{
@ -335,7 +324,7 @@ namespace WinSW
{
get
{
XmlElement? e = (XmlElement?)this.d.dom.SelectSingleNode("//logmode");
var e = (XmlElement?)this.d.dom.SelectSingleNode("//logmode");
// this is more modern way, to support nested elements as configuration
e ??= (XmlElement?)this.d.dom.SelectSingleNode("//log")!; // WARNING: NRE
@ -343,15 +332,15 @@ namespace WinSW
}
}
public override string? Mode { get => this.d.LogMode; }
public override string? Mode => this.d.LogMode;
public override string Name { get => this.d.LogName; }
public override string Name => this.d.LogName;
public override string Directory
{
get
{
XmlNode? loggingNode = this.d.dom.SelectSingleNode("//logpath");
var loggingNode = this.d.dom.SelectSingleNode("//logpath");
return loggingNode is null
? Defaults.LogDirectory
@ -359,22 +348,20 @@ namespace WinSW
}
}
public override int? SizeThreshold { get => this.d.SingleIntElement(this.E, "sizeThreshold", 10 * 1024); }
public override int? SizeThreshold => this.d.SingleIntElement(this.E, "sizeThreshold", 10 * 1024);
public override int? KeepFiles { get => this.d.SingleIntElement(this.E, "keepFiles", SizeBasedRollingLogAppender.DefaultFilesToKeep); }
public override int? KeepFiles => this.d.SingleIntElement(this.E, "keepFiles", SizeBasedRollingLogAppender.DefaultFilesToKeep);
public override int? Period { get => this.d.SingleIntElement(this.E, "period", 1); }
public override int? Period => this.d.SingleIntElement(this.E, "period", 1);
public override string Pattern
{
get
{
XmlNode? patternNode = this.E.SelectSingleNode("pattern");
var patternNode = this.E.SelectSingleNode("pattern");
if (patternNode is null)
{
#pragma warning disable S2372 // Exceptions should not be thrown from property getters
throw new InvalidDataException("Time Based rolling policy is specified but no pattern can be found in configuration XML.");
#pragma warning restore S2372 // Exceptions should not be thrown from property getters
}
return patternNode.InnerText;
@ -389,7 +376,7 @@ namespace WinSW
{
get
{
XmlNode? loggingName = this.d.dom.SelectSingleNode("//outfilepattern");
var loggingName = this.d.dom.SelectSingleNode("//outfilepattern");
return loggingName is null ? Defaults.OutFilePattern : Environment.ExpandEnvironmentVariables(loggingName.InnerText);
}
@ -399,7 +386,7 @@ namespace WinSW
{
get
{
XmlNode? loggingName = this.d.dom.SelectSingleNode("//errfilepattern");
var loggingName = this.d.dom.SelectSingleNode("//errfilepattern");
return loggingName is null ? Defaults.ErrFilePattern : Environment.ExpandEnvironmentVariables(loggingName.InnerText);
}
@ -409,7 +396,7 @@ namespace WinSW
{
get
{
XmlNode? autoRollAtTimeNode = this.E.SelectSingleNode("autoRollAtTime");
var autoRollAtTimeNode = this.E.SelectSingleNode("autoRollAtTime");
return autoRollAtTimeNode?.InnerText;
}
}
@ -418,16 +405,14 @@ namespace WinSW
{
get
{
XmlNode? zipolderthannumdaysNode = this.E.SelectSingleNode("zipOlderThanNumDays");
var zipolderthannumdaysNode = this.E.SelectSingleNode("zipOlderThanNumDays");
int? zipolderthannumdays = null;
if (zipolderthannumdaysNode != null)
{
// validate it
if (!int.TryParse(zipolderthannumdaysNode.InnerText, out int zipolderthannumdaysValue))
{
#pragma warning disable S2372 // Exceptions should not be thrown from property getters
throw new InvalidDataException("Roll-Size-Time Based rolling policy is specified but zipOlderThanNumDays does not match the int format found in configuration XML.");
#pragma warning restore S2372 // Exceptions should not be thrown from property getters
}
zipolderthannumdays = zipolderthannumdaysValue;
@ -441,7 +426,7 @@ namespace WinSW
{
get
{
XmlNode? zipdateformatNode = this.E.SelectSingleNode("zipDateFormat");
var zipdateformatNode = this.E.SelectSingleNode("zipDateFormat");
return zipdateformatNode is null ? null : zipdateformatNode.InnerText;
}
}
@ -454,7 +439,7 @@ namespace WinSW
{
get
{
XmlNodeList? nodeList = this.dom.SelectNodes("//depend");
var nodeList = this.dom.SelectNodes("//depend");
if (nodeList is null)
{
return Defaults.ServiceDependencies;
@ -540,7 +525,7 @@ namespace WinSW
/// <summary>
/// Environment variable overrides
/// </summary>
public Dictionary<string, string> EnvironmentVariables => new Dictionary<string, string>(this.environmentVariables);
public Dictionary<string, string> EnvironmentVariables => new(this.environmentVariables);
/// <summary>
/// List of downloads to be performed by the wrapper before starting
@ -550,13 +535,13 @@ namespace WinSW
{
get
{
XmlNodeList? nodeList = this.dom.SelectNodes("//download");
var nodeList = this.dom.SelectNodes("//download");
if (nodeList is null)
{
return Defaults.Downloads;
}
List<Download> result = new List<Download>(nodeList.Count);
var result = new List<Download>(nodeList.Count);
for (int i = 0; i < nodeList.Count; i++)
{
if (nodeList[i] is XmlElement element)
@ -573,25 +558,25 @@ namespace WinSW
{
get
{
XmlNodeList? childNodes = this.dom.SelectNodes("//onfailure");
var childNodes = this.dom.SelectNodes("//onfailure");
if (childNodes is null)
{
return new SC_ACTION[0];
}
SC_ACTION[] result = new SC_ACTION[childNodes.Count];
var result = new SC_ACTION[childNodes.Count];
for (int i = 0; i < childNodes.Count; i++)
{
XmlNode node = childNodes[i]!;
var node = childNodes[i]!;
string action = node.Attributes!["action"]?.Value ?? throw new InvalidDataException("'action' is missing");
SC_ACTION_TYPE type = action switch
var type = action switch
{
"restart" => SC_ACTION_TYPE.SC_ACTION_RESTART,
"none" => SC_ACTION_TYPE.SC_ACTION_NONE,
"reboot" => SC_ACTION_TYPE.SC_ACTION_REBOOT,
_ => throw new Exception("Invalid failure action: " + action)
};
XmlAttribute? delay = node.Attributes["delay"];
var delay = node.Attributes["delay"];
result[i] = new SC_ACTION(type, delay != null ? ConfigHelper.ParseTimeSpan(delay.Value) : TimeSpan.Zero);
}
@ -603,7 +588,7 @@ namespace WinSW
protected string? GetServiceAccountPart(XmlNode node, string subNodeName)
{
XmlNode? subNode = node.SelectSingleNode(subNodeName);
var subNode = node.SelectSingleNode(subNodeName);
if (subNode != null)
{
return subNode.InnerText;
@ -626,7 +611,7 @@ namespace WinSW
{
get
{
XmlNode? node = this.dom.SelectSingleNode("//serviceaccount");
var node = this.dom.SelectSingleNode("//serviceaccount");
if (node is null)
{
@ -641,7 +626,7 @@ namespace WinSW
serviceAccount.ServiceAccountPassword = this.GetServiceAccountPart(node, "password");
var loginRight = this.GetServiceAccountPart(node, "allowservicelogon");
string? loginRight = this.GetServiceAccountPart(node, "allowservicelogon");
serviceAccount.AllowServiceAcountLogonRight = this.ParseAllowServiceAcountLogonRight(loginRight);
@ -658,7 +643,7 @@ namespace WinSW
{
get
{
var value = this.SingleElement("stopparentprocessfirst", true);
string? value = this.SingleElement("stopparentprocessfirst", true);
if (bool.TryParse(value, out bool result))
{
return result;
@ -689,11 +674,11 @@ namespace WinSW
private Dictionary<string, string> LoadEnvironmentVariables()
{
XmlNodeList nodeList = this.dom.SelectNodes("//env")!;
Dictionary<string, string> environment = new Dictionary<string, string>(nodeList.Count);
var nodeList = this.dom.SelectNodes("//env")!;
var environment = new Dictionary<string, string>(nodeList.Count);
for (int i = 0; i < nodeList.Count; i++)
{
XmlNode node = nodeList[i]!;
var node = nodeList[i]!;
string key = node.Attributes!["name"]?.Value ?? throw new InvalidDataException("'name' is missing");
string value = Environment.ExpandEnvironmentVariables(node.Attributes["value"]?.Value ?? throw new InvalidDataException("'value' is missing"));
environment[key] = value;

View File

@ -13,11 +13,11 @@ namespace WinSW
public ServiceDescriptorYaml(string baseName, DirectoryInfo d)
{
var basepath = Path.Combine(d.FullName, baseName);
string basepath = Path.Combine(d.FullName, baseName);
using (var reader = new StreamReader(basepath + ".yml"))
{
var file = reader.ReadToEnd();
string file = reader.ReadToEnd();
var deserializer = new DeserializerBuilder().IgnoreUnmatchedProperties().Build();
this.Configurations = deserializer.Deserialize<YamlConfiguration>(file);
@ -37,9 +37,7 @@ namespace WinSW
this.Configurations.LoadEnvironmentVariables();
}
#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
public ServiceDescriptorYaml(YamlConfiguration configs)
#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
{
this.Configurations = configs;
this.Configurations.LoadEnvironmentVariables();

View File

@ -19,7 +19,7 @@ namespace WinSW.Util
return TimeSpan.FromMilliseconds(int.Parse(v));
}
private static readonly Dictionary<string, long> Suffix = new Dictionary<string, long>
private static readonly Dictionary<string, long> Suffix = new()
{
{ "ms", 1 },
{ "sec", 1000L },

View File

@ -29,11 +29,11 @@ namespace WinSW.Util
try
{
string query = "SELECT * FROM Win32_Process WHERE ParentProcessID = " + pid;
using ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
using ManagementObjectCollection results = searcher.Get();
foreach (ManagementBaseObject wmiObject in results)
using var searcher = new ManagementObjectSearcher(query);
using var results = searcher.Get();
foreach (var wmiObject in results)
{
var childProcessId = wmiObject["ProcessID"];
object childProcessId = wmiObject["ProcessID"];
Logger.Info("Found child process: " + childProcessId + " Name: " + wmiObject["Name"]);
childPids.Add(Convert.ToInt32(childProcessId));
}
@ -67,7 +67,7 @@ namespace WinSW.Util
}
// (bool sent, bool exited)
KeyValuePair<bool, bool> result = SignalHelper.SendCtrlCToProcess(proc, stopTimeout);
var result = SignalHelper.SendCtrlCToProcess(proc, stopTimeout);
bool exited = result.Value;
if (!exited)
{
@ -107,7 +107,7 @@ namespace WinSW.Util
{
if (!stopParentProcessFirst)
{
foreach (var childPid in GetChildPids(pid))
foreach (int childPid in GetChildPids(pid))
{
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
}
@ -117,7 +117,7 @@ namespace WinSW.Util
if (stopParentProcessFirst)
{
foreach (var childPid in GetChildPids(pid))
foreach (int childPid in GetChildPids(pid))
{
StopProcessAndChildren(childPid, stopTimeout, stopParentProcessFirst);
}

View File

@ -17,7 +17,7 @@ namespace WinSW.Util
/// <exception cref="InvalidDataException">The required element is missing</exception>
public static string? SingleElement(XmlNode node, string tagName, bool optional)
{
XmlNode? n = node.SelectSingleNode(tagName);
var n = node.SelectSingleNode(tagName);
if (n is null && !optional)
{
throw new InvalidDataException("<" + tagName + "> is missing in configuration XML");
@ -36,7 +36,7 @@ namespace WinSW.Util
/// <exception cref="InvalidDataException">The required element is missing</exception>
public static XmlNode? SingleNode(XmlNode node, string tagName, bool optional)
{
XmlNode? n = node.SelectSingleNode(tagName);
var n = node.SelectSingleNode(tagName);
if (n is null && !optional)
{
throw new InvalidDataException("<" + tagName + "> is missing in configuration XML");
@ -105,7 +105,7 @@ namespace WinSW.Util
#if NET20
try
{
var value = Enum.Parse(typeof(TAttributeType), substitutedValue, true);
object value = Enum.Parse(typeof(TAttributeType), substitutedValue, true);
return (TAttributeType)value;
}
catch (ArgumentException ex)

View File

@ -87,7 +87,7 @@ namespace WMI
public WmiRoot()
{
ConnectionOptions options = new ConnectionOptions
var options = new ConnectionOptions
{
EnablePrivileges = true,
Impersonation = ImpersonationLevel.Impersonate,
@ -118,7 +118,7 @@ namespace WMI
protected ManagementBaseObject GetMethodParameters(ManagementObject wmiObject, string methodName, ParameterInfo[] methodParameters, object[] arguments)
{
ManagementBaseObject wmiParameters = wmiObject.GetMethodParameters(methodName);
var wmiParameters = wmiObject.GetMethodParameters(methodName);
for (int i = 0; i < arguments.Length; i++)
{
string capitalizedName = Capitalize(methodParameters[i].Name!);
@ -155,9 +155,9 @@ namespace WMI
}
string methodName = method.Name;
using ManagementBaseObject? wmiParameters = arguments.Length == 0 ? null :
using var wmiParameters = arguments.Length == 0 ? null :
this.GetMethodParameters(this.wmiObject, methodName, method.GetParameters(), arguments);
using ManagementBaseObject result = this.wmiObject.InvokeMethod(methodName, wmiParameters, null);
using var result = this.wmiObject.InvokeMethod(methodName, wmiParameters, null);
this.CheckError(result);
return null;
}
@ -176,12 +176,12 @@ namespace WMI
public override object? Invoke(object proxy, MethodInfo method, object[] arguments)
{
ParameterInfo[] methodParameters = method.GetParameters();
var methodParameters = method.GetParameters();
if (method.Name == nameof(IWin32Services.Select))
{
// select method to find instances
StringBuilder query = new StringBuilder("SELECT * FROM ").Append(this.className).Append(" WHERE ");
var query = new StringBuilder("SELECT * FROM ").Append(this.className).Append(" WHERE ");
for (int i = 0; i < arguments.Length; i++)
{
if (i != 0)
@ -192,8 +192,8 @@ namespace WMI
query.Append(' ').Append(Capitalize(methodParameters[i].Name!)).Append(" = '").Append(arguments[i]).Append('\'');
}
using ManagementObjectSearcher searcher = new ManagementObjectSearcher(this.wmiClass.Scope, new ObjectQuery(query.ToString()));
using ManagementObjectCollection results = searcher.Get();
using var searcher = new ManagementObjectSearcher(this.wmiClass.Scope, new ObjectQuery(query.ToString()));
using var results = searcher.Get();
// TODO: support collections
foreach (ManagementObject wmiObject in results)
@ -205,9 +205,9 @@ namespace WMI
}
string methodName = method.Name;
using ManagementBaseObject? wmiParameters = arguments.Length == 0 ? null :
using var wmiParameters = arguments.Length == 0 ? null :
this.GetMethodParameters(this.wmiClass, methodName, methodParameters, arguments);
using ManagementBaseObject result = this.wmiClass.InvokeMethod(methodName, wmiParameters, null);
using var result = this.wmiClass.InvokeMethod(methodName, wmiParameters, null);
this.CheckError(result);
return null;
}
@ -219,7 +219,7 @@ namespace WMI
public T GetCollection<T>()
where T : IWmiCollection
{
WmiClassName className = (WmiClassName)typeof(T).GetCustomAttributes(typeof(WmiClassName), false)[0];
var className = (WmiClassName)typeof(T).GetCustomAttributes(typeof(WmiClassName), false)[0];
return (T)ProxyFactory.Create(new ClassHandler(this.wmiScope, className.Name), typeof(T), true);
}

View File

@ -96,7 +96,7 @@ namespace WinSW.Plugins
{
const int BaseBufferSize = 0x1000;
string variableKey = '\0' + variable + '=';
string buffer = new string('\0', BaseBufferSize + variableKey.Length);
string buffer = new('\0', BaseBufferSize + variableKey.Length);
fixed (char* bufferPtr = buffer)
{
long startAddress = address;
@ -171,7 +171,7 @@ namespace WinSW.Plugins
_ = NtWow64QueryInformationProcess64(
processHandle,
PROCESSINFOCLASS.ProcessBasicInformation,
out PROCESS_BASIC_INFORMATION64 information,
out var information,
sizeof(PROCESS_BASIC_INFORMATION64));
PEB64 peb;
@ -190,7 +190,7 @@ namespace WinSW.Plugins
this.StopParentProcessFirst = bool.Parse(XmlHelper.SingleElement(node, "stopParentFirst", false)!);
this.ServiceId = descriptor.Id;
// TODO: Consider making it documented
var checkWinSWEnvironmentVariable = XmlHelper.SingleElement(node, "checkWinSWEnvironmentVariable", true);
string? checkWinSWEnvironmentVariable = XmlHelper.SingleElement(node, "checkWinSWEnvironmentVariable", true);
this.CheckWinSWEnvironmentVariable = checkWinSWEnvironmentVariable is null ? true : bool.Parse(checkWinSWEnvironmentVariable);
}
@ -282,7 +282,7 @@ namespace WinSW.Plugins
}
// Kill the runaway process
StringBuilder bldr = new StringBuilder("Stopping the runaway process (pid=");
var bldr = new StringBuilder("Stopping the runaway process (pid=");
bldr.Append(pid);
bldr.Append(") and its children. Environment was ");
if (!this.CheckWinSWEnvironmentVariable)

View File

@ -10,8 +10,8 @@ namespace WinSW.Plugins
{
public class SharedDirectoryMapper : AbstractWinSWExtension
{
private readonly SharedDirectoryMappingHelper _mapper = new SharedDirectoryMappingHelper();
private readonly List<SharedDirectoryMapperConfig> _entries = new List<SharedDirectoryMapperConfig>();
private readonly SharedDirectoryMappingHelper _mapper = new();
private readonly List<SharedDirectoryMapperConfig> _entries = new();
public override string DisplayName => "Shared Directory Mapper";
@ -23,13 +23,13 @@ namespace WinSW.Plugins
public SharedDirectoryMapper(bool enableMapping, string directoryUNC, string driveLabel)
{
SharedDirectoryMapperConfig config = new SharedDirectoryMapperConfig(enableMapping, driveLabel, directoryUNC);
var config = new SharedDirectoryMapperConfig(enableMapping, driveLabel, directoryUNC);
this._entries.Add(config);
}
public override void Configure(IWinSWConfiguration descriptor, XmlNode node)
{
XmlNodeList? mapNodes = XmlHelper.SingleNode(node, "mapping", false)!.SelectNodes("map");
var mapNodes = XmlHelper.SingleNode(node, "mapping", false)!.SelectNodes("map");
if (mapNodes != null)
{
for (int i = 0; i < mapNodes.Count; i++)
@ -47,14 +47,14 @@ namespace WinSW.Plugins
{
var dict = config.GetSettings();
var mappingNode = dict["mapping"];
object mappingNode = dict["mapping"];
if (!(mappingNode is List<object> mappings))
{
throw new InvalidDataException("SharedDirectoryMapper mapping should be a list");
}
foreach (var map in mappings)
foreach (object map in mappings)
{
var mapConfig = SharedDirectoryMapperConfig.FromYaml(map);
this._entries.Add(mapConfig);
@ -63,7 +63,7 @@ namespace WinSW.Plugins
public override void OnWrapperStarted()
{
foreach (SharedDirectoryMapperConfig config in this._entries)
foreach (var config in this._entries)
{
if (config.EnableMapping)
{
@ -86,7 +86,7 @@ namespace WinSW.Plugins
public override void BeforeWrapperStopped()
{
foreach (SharedDirectoryMapperConfig config in this._entries)
foreach (var config in this._entries)
{
if (config.EnableMapping)
{

View File

@ -13,7 +13,7 @@ namespace WinSW.Plugins
/// <exception cref="MapperException">Operation failure</exception>
private void InvokeCommand(string command, string args)
{
Process p = new Process
var p = new Process
{
StartInfo =
{

View File

@ -17,7 +17,7 @@ namespace winswTests.Configuration
[Test]
public void AllOptionsConfigShouldDeclareDefaults()
{
ServiceDescriptor desc = Load("allOptions");
var desc = Load("allOptions");
Assert.That(desc.Id, Is.EqualTo("myapp"));
Assert.That(desc.Caption, Is.EqualTo("MyApp Service (powered by WinSW)"));
@ -30,7 +30,7 @@ namespace winswTests.Configuration
[Test]
public void MinimalConfigShouldDeclareDefaults()
{
ServiceDescriptor desc = Load("minimal");
var desc = Load("minimal");
Assert.That(desc.Id, Is.EqualTo("myapp"));
Assert.That(desc.Caption, Is.EqualTo("MyApp Service (powered by WinSW)"));
@ -57,7 +57,7 @@ namespace winswTests.Configuration
string path = Path.Combine(directory, $@"examples\sample-{exampleName}.xml");
Assert.That(path, Does.Exist);
XmlDocument dom = new XmlDocument();
var dom = new XmlDocument();
dom.Load(path);
return new ServiceDescriptor(dom);
}

View File

@ -15,7 +15,7 @@ namespace winswTests
public void Roundtrip_Defaults()
{
// Roundtrip data
Download d = new Download(From, To);
var d = new Download(From, To);
var sd = ConfigXmlBuilder.create()
.WithDownload(d)
.ToServiceDescriptor(true);
@ -33,7 +33,7 @@ namespace winswTests
public void Roundtrip_BasicAuth()
{
// Roundtrip data
Download d = new Download(From, To, true, Download.AuthType.Basic, "aUser", "aPassword", true);
var d = new Download(From, To, true, Download.AuthType.Basic, "aUser", "aPassword", true);
var sd = ConfigXmlBuilder.create()
.WithDownload(d)
.ToServiceDescriptor(true);
@ -51,7 +51,7 @@ namespace winswTests
public void Roundtrip_SSPI()
{
// Roundtrip data
Download d = new Download(From, To, false, Download.AuthType.Sspi);
var d = new Download(From, To, false, Download.AuthType.Sspi);
var sd = ConfigXmlBuilder.create()
.WithDownload(d)
.ToServiceDescriptor(true);
@ -98,7 +98,7 @@ namespace winswTests
[TestCase(false)]
public void Download_FailOnError(bool failOnError)
{
Download d = new Download(From, To, failOnError);
var d = new Download(From, To, failOnError);
var sd = ConfigXmlBuilder.create()
.WithDownload(d)

View File

@ -14,7 +14,7 @@ namespace winswTests
[TestFixture]
public class DownloadTests
{
private readonly HttpListener globalListener = new HttpListener();
private readonly HttpListener globalListener = new();
private readonly byte[] contents = { 0x57, 0x69, 0x6e, 0x53, 0x57 };
@ -23,7 +23,7 @@ namespace winswTests
[OneTimeSetUp]
public void SetUp()
{
TcpListener tcpListener = new TcpListener(IPAddress.Loopback, 0);
var tcpListener = new TcpListener(IPAddress.Loopback, 0);
tcpListener.Start();
int port = ((IPEndPoint)tcpListener.LocalEndpoint).Port;
string prefix = $"http://localhost:{port}/";
@ -44,7 +44,7 @@ namespace winswTests
private async Task TestClientServerAsync(Func<string, string, Task> client, Action<HttpListenerContext> server, AuthenticationSchemes authenticationSchemes = AuthenticationSchemes.Anonymous, [CallerMemberName] string path = null)
{
HttpListener listener = new HttpListener();
var listener = new HttpListener();
string prefix = $"{this.globalPrefix}{path}/";
listener.Prefixes.Add(prefix);
listener.AuthenticationSchemes = authenticationSchemes;
@ -77,7 +77,7 @@ namespace winswTests
async Task ListenAsync()
{
HttpListenerContext context = await listener.GetContextAsync();
var context = await listener.GetContextAsync();
try
{
server(context);
@ -141,7 +141,7 @@ namespace winswTests
},
context =>
{
HttpListenerBasicIdentity identity = (HttpListenerBasicIdentity)context.User.Identity;
var identity = (HttpListenerBasicIdentity)context.User.Identity;
if (identity.Name != username || identity.Password != password)
{
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
@ -157,8 +157,8 @@ namespace winswTests
[Test]
public async Task TestHttp_IfModifiedSince_ModifiedAsync()
{
DateTime lastModified = DateTime.Now.TrimToSeconds();
DateTime prevModified = lastModified.AddDays(-1);
var lastModified = DateTime.Now.TrimToSeconds();
var prevModified = lastModified.AddDays(-1);
await this.TestClientServerAsync(
async (source, dest) =>
@ -185,7 +185,7 @@ namespace winswTests
[Test]
public async Task TestHttp_IfModifiedSince_NotModifiedAsync()
{
DateTime lastModified = DateTime.Now.TrimToSeconds();
var lastModified = DateTime.Now.TrimToSeconds();
await this.TestClientServerAsync(
async (source, dest) =>
@ -215,7 +215,7 @@ namespace winswTests
await this.TestClientServerAsync(
async (source, dest) =>
{
WebException exception = await AsyncAssert.ThrowsAsync<WebException>(
var exception = await AsyncAssert.ThrowsAsync<WebException>(
async () => await new Download(source, dest).PerformAsync());
Assert.That(exception.Status, Is.EqualTo(WebExceptionStatus.ProtocolError));

View File

@ -68,7 +68,7 @@ extensions:
[Test]
public void LoadExtensions()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptor);
var manager = new WinSWExtensionManager(this._testServiceDescriptor);
manager.LoadExtensions();
Assert.AreEqual(1, manager.Extensions.Count, "One extension should be loaded");
@ -83,7 +83,7 @@ extensions:
[Test]
public void LoadExtensionsYaml()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptorYaml);
var manager = new WinSWExtensionManager(this._testServiceDescriptorYaml);
manager.LoadExtensions();
Assert.AreEqual(1, manager.Extensions.Count, "One extension should be loaded");
@ -98,7 +98,7 @@ extensions:
[Test]
public void StartStopExtension()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptor);
var manager = new WinSWExtensionManager(this._testServiceDescriptor);
manager.LoadExtensions();
manager.FireOnWrapperStarted();
manager.FireBeforeWrapperStopped();
@ -109,12 +109,12 @@ extensions:
{
Assert.Ignore();
var winswId = "myAppWithRunaway";
var extensionId = "runawayProcessKiller";
var tmpDir = FilesystemTestHelper.CreateTmpDirectory();
string winswId = "myAppWithRunaway";
string extensionId = "runawayProcessKiller";
string tmpDir = FilesystemTestHelper.CreateTmpDirectory();
// Spawn the test process
Process proc = new Process();
var proc = new Process();
var ps = proc.StartInfo;
ps.FileName = "cmd.exe";
ps.Arguments = "/c pause";
@ -126,11 +126,11 @@ extensions:
try
{
// Generate extension and ensure that the roundtrip is correct
var pidfile = Path.Combine(tmpDir, "process.pid");
string pidfile = Path.Combine(tmpDir, "process.pid");
var sd = ConfigXmlBuilder.create(id: winswId)
.WithRunawayProcessKiller(new RunawayProcessKillerExtension(pidfile), extensionId)
.ToServiceDescriptor();
WinSWExtensionManager manager = new WinSWExtensionManager(sd);
var manager = new WinSWExtensionManager(sd);
manager.LoadExtensions();
var extension = manager.Extensions[extensionId] as RunawayProcessKillerExtension;
Assert.IsNotNull(extension, "RunawayProcessKillerExtension should be loaded");

View File

@ -84,7 +84,7 @@ extensions:
[Test]
public void LoadExtensions()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptor);
var manager = new WinSWExtensionManager(this._testServiceDescriptor);
manager.LoadExtensions();
Assert.AreEqual(2, manager.Extensions.Count, "Two extensions should be loaded");
}
@ -92,7 +92,7 @@ extensions:
[Test]
public void LoadExtensionsYaml()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptorYaml);
var manager = new WinSWExtensionManager(this._testServiceDescriptorYaml);
manager.LoadExtensions();
Assert.AreEqual(2, manager.Extensions.Count, "Two extensions should be loaded");
}
@ -100,7 +100,7 @@ extensions:
[Test]
public void StartStopExtension()
{
WinSWExtensionManager manager = new WinSWExtensionManager(this._testServiceDescriptor);
var manager = new WinSWExtensionManager(this._testServiceDescriptor);
manager.LoadExtensions();
manager.FireOnWrapperStarted();
manager.FireBeforeWrapperStopped();

View File

@ -18,7 +18,7 @@ namespace winswTests
{
_ = CLITestHelper.CLITest(new[] { "install" });
using ServiceController controller = new ServiceController(CLITestHelper.Id);
using var controller = new ServiceController(CLITestHelper.Id);
Assert.That(controller.DisplayName, Is.EqualTo(CLITestHelper.Name));
Assert.That(controller.CanStop, Is.False);
Assert.That(controller.CanShutdown, Is.False);
@ -61,7 +61,7 @@ namespace winswTests
{
const string commandName = "nonExistentCommand";
string expectedMessage = "Unknown command: " + commandName;
CLITestResult result = CLITestHelper.CLIErrorTest(new[] { commandName });
var result = CLITestHelper.CLIErrorTest(new[] { commandName });
Assert.That(result.HasException, Is.True);
Assert.That(result.Out, Does.Contain(expectedMessage));

View File

@ -463,7 +463,7 @@ delayedAutoStart: true";
[Test]
public void Must_Specify_Values_Test()
{
var yml = @"
string yml = @"
name: This is a test
executable: 'C:\Program Files\Java\jdk1.8.0_241\bin\java.exe'
description: This is test winsw";

View File

@ -36,11 +36,11 @@ $@"<service>
/// <exception cref="Exception">Command failure</exception>
public static string CLITest(string[] arguments, ServiceDescriptor descriptor = null)
{
TextWriter tmpOut = Console.Out;
TextWriter tmpErr = Console.Error;
var tmpOut = Console.Out;
var tmpErr = Console.Error;
using StringWriter swOut = new StringWriter();
using StringWriter swErr = new StringWriter();
using var swOut = new StringWriter();
using var swErr = new StringWriter();
Console.SetOut(swOut);
Console.SetError(swErr);
@ -68,11 +68,11 @@ $@"<service>
public static CLITestResult CLIErrorTest(string[] arguments, ServiceDescriptor descriptor = null)
{
Exception testEx = null;
TextWriter tmpOut = Console.Out;
TextWriter tmpErr = Console.Error;
var tmpOut = Console.Out;
var tmpErr = Console.Error;
using StringWriter swOut = new StringWriter();
using StringWriter swErr = new StringWriter();
using var swOut = new StringWriter();
using var swErr = new StringWriter();
Console.SetOut(swOut);
Console.SetError(swErr);

View File

@ -47,7 +47,7 @@ namespace winswTests.Util
public string ToXMLString(bool dumpConfig = false)
{
StringBuilder str = new StringBuilder();
var str = new StringBuilder();
if (this.PrintXMLVersion)
{
// TODO: The encoding is generally wrong
@ -111,8 +111,8 @@ namespace winswTests.Util
public ConfigXmlBuilder WithRunawayProcessKiller(RunawayProcessKillerExtension ext, string extensionId = "killRunawayProcess", bool enabled = true)
{
var fullyQualifiedExtensionName = ExtensionTestBase.GetExtensionClassNameWithAssembly(typeof(RunawayProcessKillerExtension));
StringBuilder str = new StringBuilder();
string fullyQualifiedExtensionName = ExtensionTestBase.GetExtensionClassNameWithAssembly(typeof(RunawayProcessKillerExtension));
var str = new StringBuilder();
str.AppendFormat(" <extension enabled=\"{0}\" className=\"{1}\" id=\"{2}\">\n", new object[] { enabled, fullyQualifiedExtensionName, extensionId });
str.AppendFormat(" <pidfile>{0}</pidfile>\n", ext.Pidfile);
str.AppendFormat(" <stopTimeout>{0}</stopTimeout>\n", ext.StopTimeout.TotalMilliseconds);
@ -126,7 +126,7 @@ namespace winswTests.Util
public ConfigXmlBuilder WithDownload(Download download)
{
StringBuilder xml = new StringBuilder();
var xml = new StringBuilder();
xml.Append($"<download from=\"{download.From}\" to=\"{download.To}\" failOnError=\"{download.FailOnError}\"");
// Authentication

View File

@ -26,11 +26,11 @@ namespace winswTests.Util
/// <returns>Dictionary of the strings.</returns>
public static Dictionary<string, string> parseSetOutput(string filePath)
{
Dictionary<string, string> res = new Dictionary<string, string>();
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
var res = new Dictionary<string, string>();
string[] lines = File.ReadAllLines(filePath);
foreach (string line in lines)
{
var parsed = line.Split("=".ToCharArray(), 2);
string[] parsed = line.Split("=".ToCharArray(), 2);
if (parsed.Length == 2)
{
res.Add(parsed[0], parsed[1]);

View File

@ -20,17 +20,17 @@ namespace winswTests.Util
Environment.SetEnvironmentVariable("TEST_KEY", "TEST_VALUE");
var tmpDir = FilesystemTestHelper.CreateTmpDirectory();
string tmpDir = FilesystemTestHelper.CreateTmpDirectory();
string envFile = Path.Combine(tmpDir, "env.properties");
string scriptFile = Path.Combine(tmpDir, "printenv.bat");
File.WriteAllText(scriptFile, "set > " + envFile);
Process proc = new Process();
var proc = new Process();
var ps = proc.StartInfo;
ps.FileName = scriptFile;
ProcessHelper.StartProcessAndCallbackForExit(proc);
var exited = proc.WaitForExit(5000);
bool exited = proc.WaitForExit(5000);
if (!exited)
{
Assert.Fail("Process " + proc + " didn't exit after 5 seconds");
@ -50,17 +50,17 @@ namespace winswTests.Util
[Test]
public void ShouldNotHangWhenWritingLargeStringToStdOut()
{
var tmpDir = FilesystemTestHelper.CreateTmpDirectory();
string tmpDir = FilesystemTestHelper.CreateTmpDirectory();
string scriptFile = Path.Combine(tmpDir, "print_lots_to_stdout.bat");
var lotsOfStdOut = string.Join(string.Empty, Enumerable.Range(1, 1000));
string lotsOfStdOut = string.Join(string.Empty, Enumerable.Range(1, 1000));
File.WriteAllText(scriptFile, $"echo \"{lotsOfStdOut}\"");
Process proc = new Process();
var proc = new Process();
var ps = proc.StartInfo;
ps.FileName = scriptFile;
ProcessHelper.StartProcessAndCallbackForExit(proc);
var exited = proc.WaitForExit(5000);
bool exited = proc.WaitForExit(5000);
if (!exited)
{
Assert.Fail("Process " + proc + " didn't exit after 5 seconds");

View File

@ -13,10 +13,10 @@ namespace winswTests.Util
public static void AssertPropertyIsDefault(ServiceDescriptor desc, string property)
{
PropertyInfo actualProperty = typeof(ServiceDescriptor).GetProperty(property);
var actualProperty = typeof(ServiceDescriptor).GetProperty(property);
Assert.That(actualProperty, Is.Not.Null);
PropertyInfo defaultProperty = typeof(DefaultWinSWSettings).GetProperty(property);
var defaultProperty = typeof(DefaultWinSWSettings).GetProperty(property);
Assert.That(defaultProperty, Is.Not.Null);
Assert.That(actualProperty.GetValue(desc, null), Is.EqualTo(defaultProperty.GetValue(ServiceDescriptor.Defaults, null)));
@ -24,7 +24,7 @@ namespace winswTests.Util
public static void AssertPropertyIsDefault(ServiceDescriptor desc, List<string> properties)
{
foreach (var prop in properties)
foreach (string prop in properties)
{
AssertPropertyIsDefault(desc, prop);
}

View File

@ -11,7 +11,7 @@ namespace WinSW.Logging
public EventLog? Locate()
{
WrapperService? service = this.Service;
var service = this.Service;
if (service != null && !service.IsShuttingDown)
{
return service.EventLog;

View File

@ -87,8 +87,8 @@ namespace WinSW
}
// Get service info for the future use
IWin32Services svcs = new WmiRoot().GetCollection<IWin32Services>();
IWin32Service? svc = svcs.Select(descriptor.Id);
var svcs = new WmiRoot().GetCollection<IWin32Services>();
var svc = svcs.Select(descriptor.Id);
var args = new List<string>(Array.AsReadOnly(argsArray));
if (args[0] == "/redirect")
@ -182,9 +182,7 @@ namespace WinSW
default:
Console.WriteLine("Unknown command: " + args[0]);
PrintAvailableCommands();
#pragma warning disable S112 // General exceptions should never be thrown
throw new Exception("Unknown command: " + args[0]);
#pragma warning restore S112 // General exceptions should never be thrown
}
void Install()
@ -202,9 +200,7 @@ namespace WinSW
{
Console.WriteLine("Service with id '" + descriptor.Id + "' already exists");
Console.WriteLine("To install the service, delete the existing one or change service Id in the configuration file");
#pragma warning disable S112 // General exceptions should never be thrown
throw new Exception("Installation failure: Service with id '" + descriptor.Id + "' already exists");
#pragma warning restore S112 // General exceptions should never be thrown
}
string? username = null;
@ -252,12 +248,12 @@ namespace WinSW
password,
descriptor.ServiceDependencies);
using ServiceManager scm = ServiceManager.Open();
using Service sc = scm.OpenService(descriptor.Id);
using var scm = ServiceManager.Open();
using var sc = scm.OpenService(descriptor.Id);
sc.SetDescription(descriptor.Description);
SC_ACTION[] actions = descriptor.FailureActions;
var actions = descriptor.FailureActions;
if (actions.Length > 0)
{
sc.SetFailureActions(descriptor.ResetFailureAfter, actions);
@ -460,18 +456,14 @@ namespace WinSW
bool result = ProcessApis.CreateProcess(null, descriptor.ExecutablePath + " restart", IntPtr.Zero, IntPtr.Zero, false, ProcessApis.CREATE_NEW_PROCESS_GROUP, IntPtr.Zero, null, default, out _);
if (!result)
{
#pragma warning disable S112 // General exceptions should never be thrown
throw new Exception("Failed to invoke restart: " + Marshal.GetLastWin32Error());
#pragma warning restore S112 // General exceptions should never be thrown
}
}
void Status()
{
Log.Debug("User requested the status of the process with id '" + descriptor.Id + "'");
#pragma warning disable S3358 // Ternary operators should not be nested
Console.WriteLine(svc is null ? "NonExistent" : svc.Started ? "Started" : "Stopped");
#pragma warning restore S3358 // Ternary operators should not be nested
}
void Test()
@ -482,7 +474,7 @@ namespace WinSW
return;
}
WrapperService wsvc = new WrapperService(descriptor);
var wsvc = new WrapperService(descriptor);
wsvc.RaiseOnStart(args.ToArray());
Thread.Sleep(1000);
wsvc.RaiseOnStop();
@ -496,7 +488,7 @@ namespace WinSW
return;
}
WrapperService wsvc = new WrapperService(descriptor);
var wsvc = new WrapperService(descriptor);
wsvc.RaiseOnStart(args.ToArray());
Console.WriteLine("Press any key to stop the service...");
_ = Console.Read();
@ -506,9 +498,9 @@ namespace WinSW
// [DoesNotReturn]
void Elevate()
{
using Process current = Process.GetCurrentProcess();
using var current = Process.GetCurrentProcess();
ProcessStartInfo startInfo = new ProcessStartInfo
var startInfo = new ProcessStartInfo
{
UseShellExecute = true,
Verb = "runas",
@ -525,7 +517,7 @@ namespace WinSW
try
{
using Process elevated = Process.Start(startInfo)!;
using var elevated = Process.Start(startInfo)!;
elevated.WaitForExit();
Environment.Exit(elevated.ExitCode);
@ -544,18 +536,18 @@ namespace WinSW
private static void InitLoggers(IWinSWConfiguration descriptor, bool enableConsoleLogging)
{
// TODO: Make logging levels configurable
Level fileLogLevel = Level.Debug;
var fileLogLevel = Level.Debug;
// TODO: Debug should not be printed to console by default. Otherwise commands like 'status' will be pollutted
// This is a workaround till there is a better command line parsing, which will allow determining
Level consoleLogLevel = Level.Info;
Level eventLogLevel = Level.Warn;
var consoleLogLevel = Level.Info;
var eventLogLevel = Level.Warn;
// Legacy format from winsw-1.x: (DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " - " + message);
PatternLayout layout = new PatternLayout { ConversionPattern = "%d %-5p - %m%n" };
var layout = new PatternLayout { ConversionPattern = "%d %-5p - %m%n" };
layout.ActivateOptions();
List<IAppender> appenders = new List<IAppender>();
var appenders = new List<IAppender>();
// .wrapper.log
string wrapperLogPath = Path.Combine(descriptor.LogDirectory, descriptor.BaseName + ".wrapper.log");
@ -604,8 +596,8 @@ namespace WinSW
internal static unsafe bool IsProcessElevated()
{
IntPtr process = ProcessApis.GetCurrentProcess();
if (!ProcessApis.OpenProcessToken(process, TokenAccessLevels.Read, out IntPtr token))
var process = ProcessApis.GetCurrentProcess();
if (!ProcessApis.OpenProcessToken(process, TokenAccessLevels.Read, out var token))
{
ThrowWin32Exception("Failed to open process token.");
}
@ -615,7 +607,7 @@ namespace WinSW
if (!SecurityApis.GetTokenInformation(
token,
SecurityApis.TOKEN_INFORMATION_CLASS.TokenElevation,
out SecurityApis.TOKEN_ELEVATION elevation,
out var elevation,
sizeof(SecurityApis.TOKEN_ELEVATION),
out _))
{
@ -631,17 +623,17 @@ namespace WinSW
static void ThrowWin32Exception(string message)
{
Win32Exception inner = new Win32Exception();
var inner = new Win32Exception();
throw new Win32Exception(inner.NativeErrorCode, message + ' ' + inner.Message);
}
}
private static string ReadPassword()
{
StringBuilder buf = new StringBuilder();
var buf = new StringBuilder();
while (true)
{
ConsoleKeyInfo key = Console.ReadKey(true);
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter)
{
return buf.ToString();
@ -661,8 +653,8 @@ namespace WinSW
private static IWinSWConfiguration GetServiceDescriptor()
{
var executablePath = new DefaultWinSWSettings().ExecutablePath;
var baseName = Path.GetFileNameWithoutExtension(executablePath);
string executablePath = new DefaultWinSWSettings().ExecutablePath;
string baseName = Path.GetFileNameWithoutExtension(executablePath);
var d = new DirectoryInfo(Path.GetDirectoryName(executablePath)!);

View File

@ -22,7 +22,7 @@ namespace WinSW
{
private ServiceApis.SERVICE_STATUS wrapperServiceStatus;
private readonly Process process = new Process();
private readonly Process process = new();
private readonly IWinSWConfiguration descriptor;
@ -36,7 +36,7 @@ namespace WinSW
#endif
"WinSW");
internal static readonly WrapperServiceEventLogProvider eventLogProvider = new WrapperServiceEventLogProvider();
internal static readonly WrapperServiceEventLogProvider eventLogProvider = new();
/// <summary>
/// Indicates to the watch dog thread that we are going to terminate the process,
@ -79,7 +79,7 @@ namespace WinSW
/// </summary>
private void HandleFileCopies()
{
var file = this.descriptor.BasePath + ".copies";
string file = this.descriptor.BasePath + ".copies";
if (!File.Exists(file))
{
return; // nothing to handle
@ -136,7 +136,7 @@ namespace WinSW
Directory.CreateDirectory(logDirectory);
}
LogHandler logAppender = this.descriptor.Log.CreateLogHandler();
var logAppender = this.descriptor.Log.CreateLogHandler();
logAppender.EventLogger = this;
return logAppender;
@ -198,11 +198,11 @@ namespace WinSW
// handle downloads
#if VNEXT
List<Download> downloads = this.descriptor.Downloads;
Task[] tasks = new Task[downloads.Count];
var downloads = this.descriptor.Downloads;
var tasks = new Task[downloads.Count];
for (int i = 0; i < downloads.Count; i++)
{
Download download = downloads[i];
var download = downloads[i];
string downloadMessage = $"Downloading: {download.From} to {download.To}. failOnError={download.FailOnError.ToString()}";
this.LogEvent(downloadMessage);
Log.Info(downloadMessage);
@ -215,14 +215,14 @@ namespace WinSW
}
catch (AggregateException e)
{
List<Exception> exceptions = new List<Exception>(e.InnerExceptions.Count);
var exceptions = new List<Exception>(e.InnerExceptions.Count);
for (int i = 0; i < tasks.Length; i++)
{
if (tasks[i].IsFaulted)
{
Download download = downloads[i];
var download = downloads[i];
string errorMessage = $"Failed to download {download.From} to {download.To}";
AggregateException exception = tasks[i].Exception!;
var exception = tasks[i].Exception!;
this.LogEvent($"{errorMessage}. {exception.Message}");
Log.Error(errorMessage, exception);
@ -237,7 +237,7 @@ namespace WinSW
throw new AggregateException(exceptions);
}
#else
foreach (Download download in this.descriptor.Downloads)
foreach (var download in this.descriptor.Downloads)
{
string downloadMessage = $"Downloading: {download.From} to {download.To}. failOnError={download.FailOnError.ToString()}";
this.LogEvent(downloadMessage);
@ -286,7 +286,7 @@ namespace WinSW
this.ExtensionManager.LoadExtensions();
this.ExtensionManager.FireOnWrapperStarted();
LogHandler executableLogHandler = this.CreateExecutableLogHandler();
var executableLogHandler = this.CreateExecutableLogHandler();
this.StartProcess(this.process, startArguments, this.descriptor.Executable, executableLogHandler, true);
this.ExtensionManager.FireOnProcessStarted(this.process);
@ -355,7 +355,7 @@ namespace WinSW
stopArguments += " " + this.descriptor.Arguments;
Process stopProcess = new Process();
var stopProcess = new Process();
string? executable = this.descriptor.StopExecutable;
executable ??= this.descriptor.Executable;
@ -432,7 +432,7 @@ namespace WinSW
private void SignalShutdownComplete()
{
IntPtr handle = this.ServiceHandle;
var handle = this.ServiceHandle;
this.wrapperServiceStatus.CheckPoint++;
// WriteEvent("SignalShutdownComplete " + wrapperServiceStatus.checkPoint + ":" + wrapperServiceStatus.waitHint);
this.wrapperServiceStatus.CurrentState = ServiceApis.ServiceState.STOPPED;