private void StartAssemblyExe(CreoOpenMode mode, string guid, bool isComponentAssembly, string exeparams, string workingDir = null) { SyncedComponentData syncedCompData = null; if (!syncedComponents.TryGetValue(guid, out syncedCompData)) { GMEConsole.Warning.WriteLine("StartAssemblyExe(): Can't find guid " + guid); return; } string createAssemblyExe = Path.Combine(META.VersionInfo.MetaPath, "bin", "CAD", "Creo", "bin", "CADCreoParametricMetaLink.exe"); if (File.Exists(createAssemblyExe) == false) { GMEConsole.Error.WriteLine(String.Format("Could not find CADCreoParametricMetaLink.exe at '{0}'", createAssemblyExe)); return; } if (workingDir == null) { workingDir = syncedCompData.WorkingDir; } try { File.Copy(Path.Combine(GetProjectDir(), "constraintdata.xml"), Path.Combine(workingDir, "constraintdata.xml")); } catch (Exception) { // not an issue } string logfile = Path.Combine(GetProjectDir(), "log", Path.ChangeExtension("MetaLink_CreoCreateAssembly_" + Path.GetRandomFileName(), "log")); string arguments = String.Format("-v debug -g -s 127.0.0.1:{4} -w \"{0}\" -l \"{1}\" {2}, -id {3}", workingDir, logfile, exeparams, syncedCompData.InstanceId, SocketQueue.port); arguments += " -d " + guid; ProcessStartInfo info = new ProcessStartInfo() { RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = createAssemblyExe, Arguments = arguments // TODO -p ? }; if (mode == CreoOpenMode.OPEN_EMPTY) { info.Arguments += " -m passive"; } else if (!isComponentAssembly) { info.Arguments += " -m component"; } if (Configuration.ConfigProFile.Length > 0) { info.Arguments += " -c " + Configuration.ConfigProFile; } if (!string.IsNullOrWhiteSpace(syncedCompData.AuxDir)) { info.Arguments += String.Format(" -a \"{0}\"", syncedCompData.AuxDir); } Process createAssembly = new Process(); createAssembly.StartInfo = info; StringBuilder stdoutData = new StringBuilder(); StringBuilder stderrData = new StringBuilder(); createAssembly.OutputDataReceived += (o, args) => { lock (stdoutData) { stdoutData.Append(args.Data); stdoutData.Append(System.Environment.NewLine); } }; createAssembly.ErrorDataReceived += (o, args) => { lock (stderrData) { stderrData.Append(args.Data); stderrData.Append(System.Environment.NewLine); } }; createAssembly.EnableRaisingEvents = true; createAssembly.Exited += (o, args) => { lock (stderrData) { if (GMEConsole != null && createAssembly.ExitCode != 0) { string message = String.Format("CADCreoParametricMetaLink exited with code {0}", createAssembly.ExitCode); // CADCreoParametricMetaLink attempts to log everything in its log file // Ignore stderr if it doesn't contain anything useful string stdErrString = stderrData.ToString(); if (Regex.Match(stdErrString, "\\S").Success) { string errlog = "CADCreoParametricCreateAssembly_err.log"; using (StreamWriter writer = new StreamWriter(errlog)) { writer.Write(stdErrString); writer.Close(); } message += String.Format(", the logfile is {0} ", errlog); } GMEConsole.Error.WriteLine(message); SyncControl.Invoke((System.Action)(() => StartupFailureCallback(stdErrString, logfile))); } } }; LastStartedInstance = syncedCompData; createAssembly.Start(); if (TestMode_CreoJobObject != IntPtr.Zero) { JobObjectPinvoke.AssignProcessToJobObject(createAssembly, TestMode_CreoJobObject); } createAssembly.BeginOutputReadLine(); createAssembly.BeginErrorReadLine(); createAssembly.StandardInput.Close(); GMEConsole.Info.WriteLine("Creo is starting, the logfile is " + SmartLogger.GetGMEConsoleFileLink(logfile)); ShowStartupDialog(true); // createAssembly.WaitForExit(10 * 1000); }
private void StartAssemblyExe(CreoOpenMode mode, string guid, bool isComponentAssembly, string exeparams, string workingDir = null) { SyncedComponentData syncedCompData = null; if (!syncedComponents.TryGetValue(guid, out syncedCompData)) { GMEConsole.Warning.WriteLine("StartAssemblyExe(): Can't find guid " + guid); return; } string proeIsisExtensionsDir = System.Environment.GetEnvironmentVariable("PROE_ISIS_EXTENSIONS"); string createAssemblyExe = Path.Combine(proeIsisExtensionsDir ?? "", "bin", "CADCreoParametricMetaLink.exe"); if (File.Exists(createAssemblyExe) == false) { GMEConsole.Error.WriteLine("CADCreoParametricMetaLink.exe could not be found"); return; } if (workingDir == null) { workingDir = syncedCompData.WorkingDir; } try { File.Copy(Path.Combine(GetProjectDir(), "constraintdata.xml"), Path.Combine(workingDir, "constraintdata.xml")); } catch (Exception) { // not an issue } string logfile = Path.Combine(GetProjectDir(), "log", Path.ChangeExtension("MetaLink_CreoCreateAssembly_" + Path.GetRandomFileName(), "log")); string arguments = String.Format("-v debug -g -s 127.0.0.1:15150 -w \"{0}\" -l \"{1}\" {2}, -id {3}", workingDir, logfile, exeparams, syncedCompData.InstanceId); arguments += " -d " + guid; ProcessStartInfo info = new ProcessStartInfo() { RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = createAssemblyExe, Arguments = arguments // TODO -p ? }; if (mode == CreoOpenMode.OPEN_EMPTY) { info.Arguments += " -m passive"; } else if (!isComponentAssembly) { info.Arguments += " -m component"; } if (Configuration.ConfigProFile.Length > 0) { info.Arguments += " -c " + Configuration.ConfigProFile; } if (!string.IsNullOrWhiteSpace(syncedCompData.AuxDir)) { info.Arguments += String.Format(" -a \"{0}\"", syncedCompData.AuxDir); } Process createAssembly = new Process(); createAssembly.StartInfo = info; StringBuilder stdoutData = new StringBuilder(); StringBuilder stderrData = new StringBuilder(); createAssembly.OutputDataReceived += (o, args) => { lock (stdoutData) { stdoutData.Append(args.Data); stdoutData.Append(System.Environment.NewLine); } }; createAssembly.ErrorDataReceived += (o, args) => { lock (stderrData) { stderrData.Append(args.Data); stderrData.Append(System.Environment.NewLine); } }; createAssembly.EnableRaisingEvents = true; createAssembly.Exited += (o, args) => { lock (stderrData) { if (GMEConsole != null && createAssembly.ExitCode != 0) { string errlog = "CADCreoParametricCreateAssembly_err.log"; StreamWriter writer = new StreamWriter(errlog); writer.Write(stderrData.ToString()); writer.Flush(); writer.Close(); GMEConsole.Error.WriteLine(String.Format("CADCreoParametricCreateAssembly exited with code {0}, the logfile is {1}", createAssembly.ExitCode, errlog)); SyncControl.Invoke(startupFailedCallback); } } }; LastStartedInstance = syncedCompData; createAssembly.Start(); createAssembly.BeginOutputReadLine(); createAssembly.BeginErrorReadLine(); createAssembly.StandardInput.Close(); GMEConsole.Info.WriteLine("Creo is starting, the logfile is at: <a href=\"file:///{0}\" target=\"_blank\">{0}</a>", Path.Combine(workingDir, "log", logfile)); ShowStartupDialog(true); // createAssembly.WaitForExit(10 * 1000); }