.NET中本地互操作的代码组织

3

我目前正在将一些本地代码移植到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;
}

有人能够说明一下这可能如何影响运行时的代码(如果有的话)。谢谢。

1个回答

2

最好使用枚举类型。可以这样实现:

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

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

3
如果你有那么多结构体,使用 SWIG 可能会对你有所帮助。不过我个人没有使用过它。 - Roman Starkov
1
@Henrik 已经修复了 - 虽然我鼓励你在发现明显的错误时自己进行编辑。 - Roman Starkov
1
@FelixK,好的,我可能需要采用你的方法,并为枚举找到一个有意义的命名约定。 - Matthew Layton
@activwerx 这可能是最困难的部分,有时我不得不将方法名称的一部分放入枚举名称中,因为有些方法基本相同,但期望其他参数。(OpenGL: glTexImage2D 和 glTexSubImage2D)。 - Felix K.
@activwerx 不,我不这么认为,可能会导致较长的名称,但无论如何你也无法阻止这种情况的发生。 - Felix K.
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接