.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 中本机互操作性的代码组织的主要内容,如果未能解决你的问题,请参考以下文章

在本机互操作中控制 WPF

C# 对本机互操作的限制

Kotlin 与 Objective-C 框架的多平台/本机互操作性

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃

Kotlin Multiplatform - Objective-C 互操作性架构问题架构 x86_64 的未定义符号

使用 CSC 编译 C# 代码 - excel 互操作