WinAPI C++/CLR状态代码是否为C#Win32Exception?
我正在为一个小型非托管库编写一个WinAPI C++/CLR状态代码是否为C#Win32Exception?,c#,.net,c++-cli,interop,mixed-mode,C#,.net,C++ Cli,Interop,Mixed Mode,我正在为一个小型非托管库编写一个VC++/CLIC接口。该库使用并实现WINAPI方法,因此它主要使用构造作为 DWORD getResult(__out LPWSTR* result); 这意味着它不会返回请求的结果,而是返回一个状态码,请求的结果会传递到输出参数中 在C#中,我似乎(至少)有两种编写接口的方法: 无声地将其“传输”到UInt32 getResult(String^%result) 通过编写类似String^getResult()的方法,使接口更“面向对象”抛出(例如Win3
VC++/CLI
C
接口。该库使用并实现WINAPI方法,因此它主要使用构造作为
DWORD getResult(__out LPWSTR* result);
这意味着它不会返回请求的结果,而是返回一个状态码,请求的结果会传递到输出参数中
在C#中,我似乎(至少)有两种编写接口的方法:
UInt32 getResult(String^%result)代码>
String^getResult()的方法,使接口更“面向对象”当托管调用的statuscode为非零时,code>抛出(例如Win32Exception
(将statuscode包装在其NativeErrorCode
成员中)(如图所示,例如此处:)
因为我更习惯OOP而不是VC++风格的编码,所以我更喜欢选项2。然而,我不确定是否有理由认为这是一个糟糕的设计选择(或者如果没有第三种,甚至更好的方法)。这在很大程度上是一个意见问题——关于例外政策的讨论可能会永远持续下去 我认为您应该主要考虑框架的受众。如果他们已经习惯了您的非托管库,那么他们可能更喜欢“哑传输”方法 但是,如果你的用户是典型的C#开发人员,那么他们会期望#2,所以从这里开始我将介绍这一点。C#开发人员并不关心您是否包装了本机库,只希望您的库的行为与其他.NET库一样 因此,假设您使用#2,那么这本书是开始思考异常设计的好地方。MSDN上提供了一些精简的摘录:
总之,我会将尽可能多的错误代码转换为标准系统异常,如果您有其他有用的信息可以帮助调用者处理错误,那么将这些信息输入现有的系统异常(或者创建您自己的自定义异常类型,如果必须的话)。最后只能抛出Win32Exception。95%的可能性是这应该是字符串^GetResult(),并且对于任何错误代码都是异常。除非失败是可能的和预期的,否则应该将其重命名为TryGetResult()。感谢您的回答。因此,在第二条道路上似乎没有隐藏的警告。我已经开始使用第二种可能性实现接口,并且在使用它时没有任何问题(尽管在抛出异常时,我仍然需要考虑可能的内存管理问题)。