在 C# 中添加 COM 引用生成的代理存根时方法的 return 值
The return value of methods when adding a COM Reference generated proxy stub in C#
我的 ATL 项目中有这个方法,它公开了一个 COM 对象(摘自我的 *.idl
文件的片段):
[id(1)] HRESULT Create([in, string] CHAR* location, [out] CerberusErrorDetails* details);
注册我的对象并从我的托管 C# 代码添加对它的引用后,它会为此方法生成以下代理存根 C# 代码:
[DispId(1)]
void Create(string location, out CerberusErrorDetails details);
这个存根对我来说有一些问题我无法解决。首先,它不会在托管代码中 return 一个 int
值(相对于 returned HRESULT
)来告诉我实际发生了什么错误。其次,该方法将抛出异常而不是 returning 错误代码。有没有一种方法可以使函数 return 成为 int
,这样我就可以解析 details
对象(如果它不存在 return 0
,或者是否存在)获得我想要的行为的任何替代方法?任何帮助是极大的赞赏。如果您需要更多详细信息,请随时提问,我会更新问题。谢谢!
是的,可以绕过 COM 互操作层的默认异常转换行为。但是,您必须重新定义本机 COM 接口并使用 PreserveSig
属性修饰所有方法:
[ComImport]
[Guid("xxx-yyy-zzz")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ICOMInterfaceImp
{
[PreserveSig]
int Create(string location, out CerberusErrorDetails details);
}
然后您可以在您的客户端中使用此界面:
ICOMInterfaceImp obj = (ICOMInterfaceImp)new CoClassImpl();
作为替代方案,您也可以使用来自 here 的更新类型库导入器 (tlbimp.exe) 并传递 /PreserveSig
标志。
我的 ATL 项目中有这个方法,它公开了一个 COM 对象(摘自我的 *.idl
文件的片段):
[id(1)] HRESULT Create([in, string] CHAR* location, [out] CerberusErrorDetails* details);
注册我的对象并从我的托管 C# 代码添加对它的引用后,它会为此方法生成以下代理存根 C# 代码:
[DispId(1)]
void Create(string location, out CerberusErrorDetails details);
这个存根对我来说有一些问题我无法解决。首先,它不会在托管代码中 return 一个 int
值(相对于 returned HRESULT
)来告诉我实际发生了什么错误。其次,该方法将抛出异常而不是 returning 错误代码。有没有一种方法可以使函数 return 成为 int
,这样我就可以解析 details
对象(如果它不存在 return 0
,或者是否存在)获得我想要的行为的任何替代方法?任何帮助是极大的赞赏。如果您需要更多详细信息,请随时提问,我会更新问题。谢谢!
是的,可以绕过 COM 互操作层的默认异常转换行为。但是,您必须重新定义本机 COM 接口并使用 PreserveSig
属性修饰所有方法:
[ComImport]
[Guid("xxx-yyy-zzz")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ICOMInterfaceImp
{
[PreserveSig]
int Create(string location, out CerberusErrorDetails details);
}
然后您可以在您的客户端中使用此界面:
ICOMInterfaceImp obj = (ICOMInterfaceImp)new CoClassImpl();
作为替代方案,您也可以使用来自 here 的更新类型库导入器 (tlbimp.exe) 并传递 /PreserveSig
标志。