用于非静态互操作方法的 PreserveSig

PreserveSig for Non-Static Interop Method

问题

PreserveSig 属性可以应用于外部定义的非静态函数吗?例如,我们是否可以将以下方法标记为 PreserveSig = true:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.range.specialcells?view=excel-pia

研究

Microsoft 文档概述了 PreserveSig 属性的用法,用于控制作为 HRESULT 返回的错误类型是按原样返回还是转换为异常。但是这个在线的所有例子都适用于静态方法,例如见:

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.dllimportattribute.preservesig?view=netframework-4.8

最后,如果我们是定义 COM Interop 库的人,那么看起来我们可以通过使用 PreserveSig 标记它们来轻松地告诉方法不要将错误转换为异常,例如见:

https://blogs.msdn.microsoft.com/adam_nathan/2003/04/30/preservesig/

但这里的问题是它假设我们是编写库的人。它不适用于导入的 DLL 中定义的外部库。

相关

.NET C#: Is it possible to import TLB (semi-)automatically and add PreserveSig to one type?

用例

我正在使用互操作库 Microsoft.Office.Interop.Excel 循环遍历工作簿中的每个工作 sheet 并通过在每个 [=47] 的 UsedRange 上使用 Range.SpecialCells 函数检查错误=].我通过单击功能区上的按钮开始访问所有互操作对象,然后拉出应用程序对象:

Window window = e.Control.Context;
return window.Application;

然后我用这个Application对象得到一个workbook,然后是worksheets,然后是每个work的UsedRangesheet,这是一个Range对象,Interop的一部分图书馆。从这个 Range 对象,我可以调用 SpecialCells 函数,但我无法控制它抛出异常以指示未找到单元格这一事实。我一直在寻找一种告诉互操作库 "don't throw an exception for this method" 的方法,甚至是 wrapping/overriding 不抛出异常的版本的方法。

唉,您不能将属性应用于您无法控制的托管代码。