I was surfing internet for good article on how to add Restart Manager support for a Windows Form based application developed in C#.NET for Windows VISTA and higher operating system, I could not find any good one so decided write one myself.
Its a feature provided by Microsoft which allows users to update application software that is running in user system safely. The Restart Manager was introduced with Windows Vista and Windows Server 2008 OS.
The Restart Manager provides a set of APIs which can be used by a Windows Installer version 4.0 or higher and application that it intends to upgrade safely without loosing any critical work its performing.
Before Restart Manager came into picture if user had to update a running application then he has to manually stop the application, run update installer, start application once again. This sounds simple enough, but if installer updates a suite of applications\services then user had to stop and start each of them.
Restart Manager over comes above problem by transferring responsibility from user to applications themselves to restart when their updated. Using of Restart Manager also reduces the number of restart required if multiple applications are being updated.
This article is mainly focused on making a C#.NET Windows form application to be Restart Manager aware allowing a Windows Installer to restart it, for more details on how to create the installer refer MSDN topic Using Restart Manager.
Making WinForm application Restart Manager Aware
Its three step process described in detail below:
Step 1: Register your application
To allow Restart Manager to restart application it must be registered with OS. This done by calling RegisterApplicationRestart method provided in kernel32.dll. Since our code is managed we need to import the native method.
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern uint RegisterApplicationRestart(string pszCommandline, int dwFlags);
In example program above attached I have wrapped the native method in
Now we can register our application with OS, usually done in constructor method.
string commandLine = null;
Step 2: Save application state by listening to application restart message
If application needs to save it current state so that it can restart without losing any critical work then we need to listen to restart message. This is done by overriding WndProc in
protected override void WndProc(ref Message m)
if (m.Msg == WindowsMessages.WM_QUERYENDSESSION ||
m.Msg == WindowsMessages.WM_ENDSESSION)
if (m.LParam.ToInt32() == LParameter.ENDSESSION_CLOSEAPP)
Step 3: Restore application state (Optional)
Once application has restarted then it may have to go state where it had been when it was shutdown. This may have to be done based on information saved in Step2 and we can know if it was restarted via Restart Manager by passing required parameters in Step1 while registering application.
Testing Restart Manager aware application
To test whether your application will restart as needed you can use Logo Testing Tools for Windows provided by Microsoft, it can be download via this link.
Once you have installed testing tool then you need to open command prompt and go to C:\Program Files\Microsoft Corporation\Logo Testing Tools for Windows\Restart Manager now based on your processor architecture you need to choose AMD64 or x86. My machine is x86.
Now start your test application and get PID(Process Identifier) from Task Manager. Type the following command in above command prompt.
>RMTool.exe -p 682408 -S -R
Command Parameter explained below:
- -p takes PID to know which application instance needs to restarted. The single character space must be provided between -p and PID.
- -S indicates that application needs to be shutdown.
- -R indicated that application needs to restarted after shutdown.
The RMTool.exe will initiate shutdown and restart sequence to specified application and will show result of each step as shown below.
If an error occurs it will be shown to user as below. Based on which stage of shutdown or restart error occurs you may need to fix your application.
Points of Interest
Encountered Issues :
- When I was adding Restart Manager support for one of my C#.NET application, I had to close all BITS jobs created by my application in main form's FormClosed event before terminating. When Restart Manager tried to shutdown my application it threw exception with following error message 'An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)).'
it looks like we cannot access COM services while shutdown occurs through Restart Manager, since same code works fine when user closes the application. If anybody has a solution this problem please contact me.