c# - Setting specific COM HRESULT value from .NET -
i'm creating .net assembly needs com callable e.g. vb6 etc.
most of stuff works fine - i'm fine-tuning error handling right now.
what i'd create specific hresult
values exceptions - e.g. use values 0x88880001
etc. exception cases. i'd use common "prefix" (like 0x8888
) , add internal error codes (running decimal 1001 up) number.
so internal error 1001 should become hresult = 0x888803e9
, forth.
i have own custom .net exception class, , know can set protected hresult
property on base applicationexception
class - somehow can't manage "prefix" plus error code work....
using system;
public class customexception : applicationexception { public customexception(string message, int errorcode) : base(message) { base.hresult = (uint) 0x88880000 + errorcode; } }
no matter try here - cannot int
value (for base.hresult
, int
) represents 0x888803e9
stored base class...
what missing here??
the c# compiler hassles stop tripping overflow bug. justifiably, lot of kind of code cannot survive overflow checking, not kind of mishap ever want in error handling code :) note how code in upvoted answer keels on project > properties > build > advanced > "check arithmetic overflow/underflow" option ticked. option doesn't used enough.
you have use unchecked keyword suppress runtime check:
base.hresult = unchecked((int)(0x88880000u + errorcode));
or can suppress @ compile time:
const int errorbase = unchecked((int)0x88880000); base.hresult = errorbase + errorcode;
excruciatingly: hresult you'll generate not valid one, doesn't have correct facility code. code provides hint error came from. interop code should use 0x80040000 error base select facility_itf. not sure you'll ever grief on 0x88880000 though, message string generate important. unfortunately isupporterrorinfo tends skipped in client code there's no great guarantee sees it.
Comments
Post a Comment