Over the past couple of days, we’ve been trying to debug a problem reported by a customer of our WPF program, Payslips for PAYE Tools.
The customer was reporting that the program was crashing, and not generating any error reports (internally, we hook into the unhandled exception handler, and generate an email message containing the report, so we can examine the flaw).
Eventually after connecting to his machine remotely, we discovered that there were events in the event log, and they were TypeInitializationExceptions.
That exception is thrown when a static constructor fails for some reason.
Unfortunately, that implied that some of our static members were failing to initialize correctly. So, we took the initialization and moved it into the instance constructor (as it was the App class), hooked up the error handler at the beginning of the class constructor, and crossed my fingers that it would catch the error.
But it didn’t work! So I added a message box at the beginning of the class constructor. That didn’t show either on the afflicted system. With hundreds of working installs, it had to be something to do with the installation, so another connection to the remote PC was made, and we noticed that there were outstanding Windows updates for .NET 4.0
We left the customer to install them, but he told us that the updates also failed.
Eventually, he told us that the error messages led him to the .NET removal tool (link to follow).
We suggested that he should run that, reinstall our program, and let it download the .NET framework.
And what a surprise, our program now works correctly.
But what a horrible experience for the end user! How does an install get into that state, and how can we diagnose it?