internal static bool TryCreateServerCore(string clientDir, string pipeName) { var serverInfo = GetServerProcessInfo(clientDir, pipeName); if (!File.Exists(serverInfo.toolFilePath)) { return(false); } if (PlatformInformation.IsWindows) { // As far as I can tell, there isn't a way to use the Process class to // create a process with no stdin/stdout/stderr, so we use P/Invoke. // This code was taken from MSBuild task starting code. STARTUPINFO startInfo = new STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); startInfo.hStdError = InvalidIntPtr; startInfo.hStdInput = InvalidIntPtr; startInfo.hStdOutput = InvalidIntPtr; startInfo.dwFlags = STARTF_USESTDHANDLES; uint dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW; PROCESS_INFORMATION processInfo; Log("Attempting to create process '{0}'", serverInfo.processFilePath); var builder = new StringBuilder($@"""{serverInfo.processFilePath}"" {serverInfo.commandLineArguments}"); bool success = CreateProcess( lpApplicationName: null, lpCommandLine: builder, lpProcessAttributes: NullPtr, lpThreadAttributes: NullPtr, bInheritHandles: false, dwCreationFlags: dwCreationFlags, lpEnvironment: NullPtr, // Inherit environment lpCurrentDirectory: clientDir, lpStartupInfo: ref startInfo, lpProcessInformation: out processInfo); if (success) { Log("Successfully created process with process id {0}", processInfo.dwProcessId); CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); } else { Log("Failed to create process. GetLastError={0}", Marshal.GetLastWin32Error()); } return(success); } else { try { var startInfo = new ProcessStartInfo() { FileName = serverInfo.processFilePath, Arguments = serverInfo.commandLineArguments, UseShellExecute = false, WorkingDirectory = clientDir, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; Process.Start(startInfo); return(true); } catch { return(false); } } }
internal static bool TryCreateServerCore(string clientDir, string pipeName) { // The server should be in the same directory as the client string expectedPath = Path.Combine(clientDir, ServerName); if (!File.Exists(expectedPath)) return false; // As far as I can tell, there isn't a way to use the Process class to // create a process with no stdin/stdout/stderr, so we use P/Invoke. // This code was taken from MSBuild task starting code. STARTUPINFO startInfo = new STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); startInfo.hStdError = InvalidIntPtr; startInfo.hStdInput = InvalidIntPtr; startInfo.hStdOutput = InvalidIntPtr; startInfo.dwFlags = STARTF_USESTDHANDLES; uint dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW; PROCESS_INFORMATION processInfo; Log("Attempting to create process '{0}'", expectedPath); var builder = new StringBuilder($@"""{expectedPath}"" ""-pipename:{pipeName}"""); bool success = CreateProcess( lpApplicationName: null, lpCommandLine: builder, lpProcessAttributes: NullPtr, lpThreadAttributes: NullPtr, bInheritHandles: false, dwCreationFlags: dwCreationFlags, lpEnvironment: NullPtr, // Inherit environment lpCurrentDirectory: clientDir, lpStartupInfo: ref startInfo, lpProcessInformation: out processInfo); if (success) { Log("Successfully created process with process id {0}", processInfo.dwProcessId); CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); } else { Log("Failed to create process. GetLastError={0}", Marshal.GetLastWin32Error()); } return success; }
internal static bool TryCreateServerCore(string clientDir, string pipeName) { bool isRunningOnCoreClr = CoreClrShim.IsRunningOnCoreClr; string expectedPath; string processArguments; if (isRunningOnCoreClr) { // The server should be in the same directory as the client var expectedCompilerPath = Path.Combine(clientDir, ServerNameCoreClr); expectedPath = Environment.GetEnvironmentVariable("DOTNET_HOST_PATH") ?? "dotnet"; processArguments = $@"""{expectedCompilerPath}"" ""-pipename:{pipeName}"""; if (!File.Exists(expectedCompilerPath)) { return(false); } } else { // The server should be in the same directory as the client expectedPath = Path.Combine(clientDir, ServerNameDesktop); processArguments = $@"""-pipename:{pipeName}"""; if (!File.Exists(expectedPath)) { return(false); } } if (PlatformInformation.IsWindows) { // As far as I can tell, there isn't a way to use the Process class to // create a process with no stdin/stdout/stderr, so we use P/Invoke. // This code was taken from MSBuild task starting code. STARTUPINFO startInfo = new STARTUPINFO(); startInfo.cb = Marshal.SizeOf(startInfo); startInfo.hStdError = InvalidIntPtr; startInfo.hStdInput = InvalidIntPtr; startInfo.hStdOutput = InvalidIntPtr; startInfo.dwFlags = STARTF_USESTDHANDLES; uint dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW; PROCESS_INFORMATION processInfo; Log("Attempting to create process '{0}'", expectedPath); var builder = new StringBuilder($@"""{expectedPath}"" {processArguments}"); bool success = CreateProcess( lpApplicationName: null, lpCommandLine: builder, lpProcessAttributes: NullPtr, lpThreadAttributes: NullPtr, bInheritHandles: false, dwCreationFlags: dwCreationFlags, lpEnvironment: NullPtr, // Inherit environment lpCurrentDirectory: clientDir, lpStartupInfo: ref startInfo, lpProcessInformation: out processInfo); if (success) { Log("Successfully created process with process id {0}", processInfo.dwProcessId); CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); } else { Log("Failed to create process. GetLastError={0}", Marshal.GetLastWin32Error()); } return(success); } else { try { var startInfo = new ProcessStartInfo() { FileName = expectedPath, Arguments = processArguments, UseShellExecute = false, WorkingDirectory = clientDir, RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true }; Process.Start(startInfo); return(true); } catch { return(false); } } }