How are you currently deploying the app? ClickOnce can do assembly (GAC) checks before launch, and with msi you should have a whole range of pre-check options available... although not always feasible, you might consider one of these deployment options?
Re catching the exception - just be sure to split the Main up so that it does nothing except catch the exception - otherwise JIT can stop your Main from loading:
// [STAThread] here if winform
[MethodImpl(MethodImplOptions.NoInlining)]
static void Main() {
try {
MainCore();
} catch (SomeException ex) {
// TODO something simple but fun
}
}
static void MainCore() { ... } // your app here...
If you put too much in the outer Main, it can barf before running any of it, since JIT might need the types.