Have you tried RuntimeCompatibilityAttribute.WrapNonExceptionThrows?
Alternatively, a catch block without a type should catch non CLS-compliant exceptions, i.e:
try
{
// Code here.
// Maybe a COM call here.
}
catch(Exception ex)
{
// Managed exceptions.
}
catch
{
// non CLS-compliant exceptions.
}
Using a seperate AppDomain will most likely not work depending on why exactly your application is getting killed off in the first place as unhandled exceptions will still kill the entire process and currently your exception is unhandled as you haven't caught it.
Alternatively you could use the COM objects within a separate process and use inter process communication between the two. This would isolate the problematic code into it's own process which you can then restart / use as needed without your main process being killed off.