在MSDN我发现下面的描述了两个属性:的DllImport - PreserverSig和SetLastError属性
PreserveSig将PreserveSig字段设置为true,直接翻译与HRESULT或retval的值,非托管签名;将其设置为false以自动将HRESULT或retval值转换为例外。默认情况下,PreserveSig字段为true。
SetLastError使调用者能够使用Marshal.GetLastWin32Error API函数来确定执行该方法时是否发生错误。在Visual Basic中,默认值为true(这会增加一些开销);在C#和C++中,默认值为false。
我的问题是:这两者如何相互关联?假设我将PreserveSig设置为'false' - 这意味着我应该将HRESULT转换为异常 - 如果非托管函数返回表示发生错误或没有错误的整数,那么这怎么会被转换为异常呢?
此外,为什么我需要调用GetLastWin32Error方法,如果我以某种方式设法使用PreserveSig提取异常?
亲切的问候 PK
我没有COM对象的经验,所以让我再问一个关于创建方法签名的问题。问题是:当我看到COM函数返回HRESULT时,我可以将我的方法标记为返回void并设置PreserveSig = false(如您所述),或者设置PreserveSig = true并将我的方法标记为返回IntPtr以手动检查返回的代码? – pkolodziej 2009-04-18 17:42:53