The only more or less reliable way to cancel the execution of native code, is to run it in a separate process, and to stop that process.
That will work reliably only if that process doesn't do I/O though. If it does, who knows what happens if it is interrupted in the middle of an I/O operation.
There are several ways to run the call in a separate process, and to marshal the parameters and return values across the process boundary. Using WCF is one option. Using the managed add-in framework is another one (though I would not recommend it). Running a console program using the System.Diagnostics.Process class and capturing the output stream is probably the best option.