- Home /
Type 'System.Diagnostics.Process' does not contain a definition for 'CloseMainWindow'
Hello!
I am writing an application in Unity that requires another application to be running. I have been able to successfully start another program from Unity, but I have not been able to close it. I am
using System.Diagnostics
...
Process p = new Process();
p.StartInfo.FileName = @"C:\path\to\program.exe";
p.Start(); // works up to this point
p.CloseMainWindow(); // throws a compiler error
When I try to run this code, I get a compile error:
Type 'System.Diagnostics.Process' does not contain a definition for 'CloseMainWindow' and no extension method 'CloseMainWindow' of type 'System.Diagnostics.Process' could be found (are you missing a using directive or an assembly reference?)
I get a similar error for the Kill() method.
Both the Kill() and CloseMainWindow() methods are suggested by intellisense in the Monodevelop IDE, and documented in the C# .NET
My theory is that Unity has blocked some features of the .NET framework to prevent a Unity process from shutting down other processes. I have tried using System.Reflection to look inside the Process class, but it isn't working for some mysterious reason (this being my first time using reflection in C#).
How can I close this extra process when the user closes Unity?
Thanks!
I have not figured out what is going on, but I have figured out a workaround. Replace:
p.Close$$anonymous$$ainWindow()
with:
p.GetType().Get$$anonymous$$ethod( "Close$$anonymous$$ainWindow" ).Invoke( p, new object[]{} );
Using reflection shows that Close$$anonymous$$ainWindow and $$anonymous$$ill are both still defined, so it seems like a Unity-specific compiler issue.
Another gotcha: If the new process s$$anonymous$$ls focus from Unity, Unity will pause its execution and will not run the Close$$anonymous$$ainWindow method until you click back on it.
Hmm, that sounds strange. According to the $$anonymous$$onoCompatibility page this method is supported for standalone builds.
The focus problem is related to your runInBackground - setting which can be configured in the Player settings.
If you're sure that it won't compile in Unity you could create a small sample project which reproduces the problem and file a bugreport so the Unity staff know about the problem.
I started to do this process, but then in my debug project Close$$anonymous$$ainWindow() worked perfectly. Something must be obscuring the method in my original project.
Answer by TimK_personal · Oct 28, 2014 at 09:53 PM
It's a million years since this question was asked, but for others (like me) who stumble across this: you are probably not running on a platform that supports these calls, such as the Web Player.