.NET 中本机互操作性的代码组织
Posted
技术标签:
【中文标题】.NET 中本机互操作性的代码组织【英文标题】:Code organisation for native interoperability in .NET 【发布时间】:2012-10-10 10:37:40 【问题描述】:我目前正在将一些本机代码移植到 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】:最好使用枚举。像这样的:
[StructLayout(LayoutKind.Sequential)]
public struct NATIVE_STRUCTURE
public NativeFoo FooValue;
public enum NativeFoo
VALUE1 = 0x0001,
VALUE2 = 0x0002,
【讨论】:
是的,我想过这样做。不幸的是,这将增加大量枚举,因为大约有 2000 个结构,其中任何一个都可能需要多个枚举。但是 +1 的努力,谢谢! @activwerx 有了这么多的结构,你可能会受益于弄清楚如何让SWIG 为你做这件事。不过我个人没用过。 VALUE1 和 VALUE2 的值都是 0x1。 @Henrik 已修复 - 尽管我鼓励您在发现此类明显错误时自行编辑。 @FelixK,好的,我可能不得不使用您的方法并为枚举找到一个有意义的命名约定。以上是关于.NET 中本机互操作性的代码组织的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 与 Objective-C 框架的多平台/本机互操作性
本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃