C# NET中本机互操作性的代码组织

C# NET中本机互操作性的代码组织,c#,.net,pinvoke,language-interoperability,C#,.net,Pinvoke,Language Interoperability,我目前正在将一些本机代码移植到C#,C#由各种结构、委托、枚举和外部方法调用组成 结构中的某些字段希望应用某些常量。在结构中列出常量似乎是合乎逻辑的,而不是在单独的位置,因为这样可以使所有内容都井然有序,但我不确定在封送处理/与本机调用的互操作性期间,这会对结构产生什么影响 例如,我的结构定义如下: [StructLayout(LayoutKind.Sequential)] public struct NATIVE_STRUCTURE { public int Value; } 此实

我目前正在将一些本机代码移植到C#,C#由各种结构、委托、枚举和外部方法调用组成

结构中的某些字段希望应用某些常量。在结构中列出常量似乎是合乎逻辑的,而不是在单独的位置,因为这样可以使所有内容都井然有序,但我不确定在封送处理/与本机调用的互操作性期间,这会对结构产生什么影响

例如,我的结构定义如下:

[StructLayout(LayoutKind.Sequential)]
public struct NATIVE_STRUCTURE
{
     public int Value;
}
此实例中的值可能需要以下常量之一

VALUE1 = 0x0001;
VALUE2 = 0x0002;
那么,我这样写这些结构安全吗

[StructLayout(LayoutKind.Sequential)]
public struct NATIVE_STRUCTURE
{
     public int Value;

     public const int VALUE1 = 0x0001;
     public const int VALUE2 = 0x0002;
}

有人能解释一下这在运行时会如何影响代码(如果有的话)。谢谢。

最好使用枚举。大概是这样的:

[StructLayout(LayoutKind.Sequential)]
public struct NATIVE_STRUCTURE
{
    public NativeFoo FooValue;
}

public enum NativeFoo
{
   VALUE1 = 0x0001,
   VALUE2 = 0x0002,
}

是的,我想过这样做。不幸的是,这将添加大量枚举,因为大约有2000个结构,其中任何一个都可能需要多个枚举。但是+1表示感谢@有这么多结构的activwerx,您可能会从了解如何为自己做这件事中受益。不过我个人还没有使用过它。VALUE1和VALUE2都有值0x1。@Henrik已修复-尽管我鼓励您在发现这样明显的错误时编辑自己。@FelixK,好的,我可能必须使用您的方法,为枚举找到一个有意义的命名约定。