Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WinAPI C++/CLR状态代码是否为C#Win32Exception?_C#_.net_C++ Cli_Interop_Mixed Mode - Fatal编程技术网

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()的方法,使接口更“面向对象”抛出(例如
    Win32Exception
    (将statuscode包装在其
    NativeErrorCode
    成员中)(如图所示,例如此处:)
  • 当然,在多输出函数的情况下,这并不是那么简单,但假设我不关心它们


    因为我更习惯OOP而不是VC++风格的编码,所以我更喜欢选项2。然而,我不确定是否有理由认为这是一个糟糕的设计选择(或者如果没有第三种,甚至更好的方法)。

    这在很大程度上是一个意见问题——关于例外政策的讨论可能会永远持续下去

    我认为您应该主要考虑框架的受众。如果他们已经习惯了您的非托管库,那么他们可能更喜欢“哑传输”方法

    但是,如果你的用户是典型的C#开发人员,那么他们会期望#2,所以从这里开始我将介绍这一点。C#开发人员并不关心您是否包装了本机库,只希望您的库的行为与其他.NET库一样

    因此,假设您使用#2,那么这本书是开始思考异常设计的好地方。MSDN上提供了一些精简的摘录:

    至于使用Win32Exception,如果可能的话,我会避免使用它(但我这样说是在不知道您的错误或您正在处理的错误数量的情况下)。问题是,它只向用户提供一条类似“拒绝访问”或“未找到文件”的一般Win32错误消息,这对.NET开发人员来说是不愉快的,因为它提供了最小的上下文(即,未找到什么文件??)


    总之,我会将尽可能多的错误代码转换为标准系统异常,如果您有其他有用的信息可以帮助调用者处理错误,那么将这些信息输入现有的系统异常(或者创建您自己的自定义异常类型,如果必须的话)。最后只能抛出Win32Exception。

    95%的可能性是这应该是字符串^GetResult(),并且对于任何错误代码都是异常。除非失败是可能的和预期的,否则应该将其重命名为TryGetResult()。感谢您的回答。因此,在第二条道路上似乎没有隐藏的警告。我已经开始使用第二种可能性实现接口,并且在使用它时没有任何问题(尽管在抛出异常时,我仍然需要考虑可能的内存管理问题)。