gpt4 book ai didi

c# - 枚举/结构的 P/Invoke 和 NativeMethods 约定

转载 作者:行者123 更新时间:2023-11-30 21:48:27 26 4
gpt4 key购买 nike

在执行 pinvoke 时,约定是将它们放在 NativeMethods 类中,但是请记住,枚举和结构都不需要在类中,pinvoke 使用的枚举和结构的约定是什么?

是否也将它们放在 NativeMethods 类中,在一个单独的类中,根本没有类?

我想对于 pinvoke 使用的常量来说也是如此,约定是否也将它们放在 NativeMethods 类中?

此外,pinvoke 函数使用的命名结构、枚举和常量的约定是什么?在 C++ 中,它们将被定义为类似 CREATE_VIRTUAL_DISK_VERSION 的约定,是保持原样或将它们转换为 C# 标准的约定,在这种情况下将使其成为 CreateVirtualDiskVersion?

编辑

为了更清晰的示例,让我们使用以下结构,它在 MSDN 中定义并由 native 函数 ExpandVirtualDisk 使用:

typedef struct _EXPAND_VIRTUAL_DISK_PARAMETERS {
EXPAND_VIRTUAL_DISK_VERSION Version;
union {
struct {
ULONGLONG NewSize;
} Version1;
};
} EXPAND_VIRTUAL_DISK_PARAMETERS, *PEXPAND_VIRTUAL_DISK_PARAMETERS;

当在 C# 中声明它以便它可以作为参数传递给 ExpandVirtualDisk native 函数时,您是否将其声明为...

public struct EXPAND_VIRTUAL_DISK_PARAMETERS
{
public EXPAND_VIRTUAL_DISK_VERSION Version;
(...)
}

或者类似...

public struct ExpandVirtualDiskParameters
{
public ExpandVirtualDiskVersion Version;
(...)
}

你会把它放在 NativeMethods 类中吗?

最佳答案

pinvoke 声明应该在 Un/SafeNativeMethods 类中是 Microsoft 程序员的编码指南。不幸的是,当他们还发布了用于执行编码指南的工具(以前称为 FxCop)时,该规则泄露了。

当您为 Microsoft 处理基础程序集时,这样做有些有意义,它减少了声明重复的可能性,并且 pinvoke 声明可能在不同的类中多次使用。 .NET 框架程序集有很多 pinvoke 代码。迫使 Microsoft 程序员考虑安全性也很重要。然而,它们仍然会重复,不同的基础程序集每个都有自己的一组 pinvoke 声明,并且它们经常彼此不一致。在命名以及安全/不安全的选择上。不是很漂亮,但让不同的团队在框架的不同部分工作有点不可避免的副作用。

这些相同的规则不适用于像我们这样的凡人。应尽可能避免使用 Pinvoke。任何声明的一个很好的范围是 private,一个尽可能隐藏的实现细节,最好尽可能靠近使用它的代码。但是,如果您喜欢使用代码分析并且不想维护自己的规则集,那么您将不得不按照 Microsoft 的方式进行操作。

最明智的做法是采用您团队的编码指南并有一个匹配的规则集来执行它。在这一点上,你可以做任何你想做的事情,并得到团队的同意。标识符名称大小写也是如此。我个人总是从 SDK 头文件复制/粘贴,这是避免很难诊断错误的最佳方法。并且从来没有找到重命名标识符的充分理由,编译器不在乎,并且声明与普通声明根本不同,这让我有充分的理由让它看起来也有所不同。但这只是我个人的喜好,我无法帮助您自行决定。

关于c# - 枚举/结构的 P/Invoke 和 NativeMethods 约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com