关于 c#:如何编组 WinApi 函数的返回值?

How To Marshal Return Values Of WinApi Functions?

简单:如何显式编组 WinAPi 函数的结果?

我知道如何在 C# 中编组 WinApi 函数的参数,但我怎样才能编组返回值?还是我实际上必须编组它们?我了解 WinAPi 仅返回 BOOL 或所有类型的 INT (句柄在非托管代码中也是 int )。

1
2
3
4
5
6
7
// common signature
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

// my prefered signature because easy to handle the result
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern FileAttributes GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

因为 FileAttributes 是枚举并且每个值都可以轻松地转换为 INT 我确信我对这个表示法是安全的。但是我可以像处理参数一样在这个签名中编组结果吗?我其实只知道 Marshal 类和 MarshalAs 属性。


是的,你可以。您只需要使用 [return:] 属性语法,例如:

1
[return: MarshalAs(UnmanagedType.LPStruct)]

但在你的情况下,没有编组要做。不需要编组来转换这样的整数类型,因此只需在示例中使用第二种形式。

如果你真的想要,你可以编写一个名为 GetFileAttributes() 的公共方法来检查返回值的有效性。