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

C# 枚举/结构的P/Invoke和NativeMethods约定,c#,enums,pinvoke,C#,Enums,Pinvoke,在执行pinvoke时,约定是将它们放在NativeMethods类中,但请记住,枚举和结构都不需要在类中,pinvoke使用的枚举和结构的约定是什么 是否也要将它们放在NativeMethods类中,放在一个单独的类上,而不放在任何类上 我想pinvoke使用的const也是这样,是不是约定将它们放在NativeMethods类中 另外,pinvoke函数使用的结构、枚举和常量的命名约定是什么?在C++中,它们将被定义为“代码> CuraTyValualDISKYVALUTION/CODE >

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

是否也要将它们放在NativeMethods类中,放在一个单独的类上,而不放在任何类上

我想pinvoke使用的const也是这样,是不是约定将它们放在NativeMethods类中

另外,pinvoke函数使用的结构、枚举和常量的命名约定是什么?在C++中,它们将被定义为“代码> CuraTyValualDISKYVALUTION/CODE >,是保持其精确性或将其转换为C标准的约定,在这种情况下,它将使其成为代码> CurrVeValtualDekValp< <代码> < /P> 编辑

为了获得更清晰的示例,让我们使用MSDN中定义的、本机函数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
本机函数时,是否将其声明为

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 framework程序集有很多pinvoke代码。迫使微软程序员考虑安全问题也相当重要。然而,它们仍然会得到重复,不同的基程序集都有自己的pinvoke声明集,并且它们常常彼此不一致。在命名和安全/不安全选择方面。不是很漂亮,但是让不同的团队在框架的不同部分工作会产生一些不可避免的副作用

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


最明智的方法是采用团队的编码准则,并有一个匹配的规则集来实施它。在这一点上,你可以做任何你想做的事情,并得到团队的同意。标识符名称大小写也是如此。我个人总是从SDK头文件复制/粘贴,这是避免很难诊断错误的最佳方法。我从来没有找到重命名标识符的好理由,编译器也不在乎,而且声明与普通声明根本不同,这也给了我一个保持其外观不同的好理由。但这只是我个人的喜好,我不能帮你自己决定。

标准?不知道。但我更喜欢把它们放在
NativeMethods
中。至于命名,我保留C++命名,以使其能够与针对本机代码的目标保持一致。@ UR我感觉您可能误解了我。请看一下我的编辑以便澄清。