(preliminary note: I’m not yet fully up to speed with the whole ‘interop’ thing…)
When using a COM library from within .NET, all HRESULT methods are wrapped into something that throws when the return code is not SUCCEEDED.
//ATL magic exluded
class C {
HRESULT foo(){ return E_FAIL; }
};
// usage code:
if( SUCCEEDED( c.foo() ) ) {
// success code
} else {
// failure code
}
The .NET counterpart of this code reads:
try {
c.foo();
// success code
} catch ( Exception e ) {
// failure code
}
Is there a way to access the COM return code directly in .NET, so that no exception handling is needed?
Yes, but you’ll have to manually define the interop interface (rather than use tlbimp.exe) and use the PreserveSig attribute on the methods in question.
For example:
That is the equivalent of a COM method with the signature
HRESULT DoSomething([out, retval] int *result);If your interface is very complicated or you get stuck on how to define the interop interface, I recommend using tlbimp.exe, then using Reflector or ILSpy or something similar to decompile the generated interfaces, and then edit those to your liking. Saves work, too. 🙂