具有对 C# 的整数引用的元帅结构

Posted

技术标签:

【中文标题】具有对 C# 的整数引用的元帅结构【英文标题】:Marshal structure with integer references to C# 【发布时间】:2011-09-30 18:43:00 【问题描述】:

您好,我正在尝试将以下结构从 C# 创建并编组为 C++,并维护链接的引用。我不确定这个结构应该如何在 C# 中定义?在 C++ 中,结构必须如下所示,并保持 const 引用。

// C++
struct 
        int   a;       // my value
  const int&  b = a;   // my reference to a

有人知道这是否可行吗?

谢谢。

编辑:

这更能代表我想要完成的工作,正如@Hans 指出的那样,它不是合法的 C++,但也许有人可以提出更好的路径? system_t 在 C++ 或 C# 中生成并传递给 C++。我最好的猜测:(如果这甚至是一个好的设计模式) 是在 C++ 中初始化 system_t 构造函数中的所有引用。至于从 C# 编组,它会变得复杂。

struct system_t

  float    sysSampleRate = 112500.0f;            // Sample rate from receivers.
                                                 // Illegal statement @Hans

  struct tvg_t  // tvg_t is passed to tvg processor 
  
          float    tvgLinearGain;
    const float&   tvgSampleRate = sysSampleRate;   // Get the rate from system.
                                                    // Illegal statement @Hans
   tvg;   // Nested tvg_t in system_t.

  //... Many other structures and variables ..//
;

我希望找到正确的设计模式,而不是放弃这种设计模式并采用扁平结构或将system_t 传递给每个模块。

【问题讨论】:

您的问题到底是什么?我猜你想知道你是否可以在一个结构中拥有一个引用值,当然在 C# 中这样做没有多大意义,因为你可以简单地将整个结构作为引用传递。 b 需要在 C++ 代码中引用 a,但是该结构是在 C# 中生成的并且需要编组。是否可以在 C# 中创建这种结构并将其编组?会不会是结构中的Int32IntPtr,而IntPtr 指向Int32 如果它引用结构中的一个字段,为什么还要麻烦呢?这似乎有悖常理。 实际问题有多个嵌套结构,它们共享公共值,通过引用链接。 您的问题需要更新。您需要明确说明您希望在 C# 代码中初始化引用。 【参考方案1】:

这应该可行:

[StructLayout(LayoutKind.Sequential)]
public struct MyCStruct 
  public int a;
  public IntPtr b;

【讨论】:

结构体中将b设为常量/只读,在构造函数中初始化为指向a是否合理? 你会如何建议这样做?当您从 C++ 编组它时,b 将是非托管指针地址。 对,我在想什么,呵呵。我喜欢在托管方面将其设为私有的想法。 我相信这种布局会满足您的需要,但是当您在托管端构建其中一个时,您将不得不在本机代码中分配和初始化此结构,并将其编组回来。如果我这样做,我会将其设为内部私有结构并使用托管属性包装访问。如果是新开发,这对我来说似乎很复杂,但如果适应本机现有代码,这可能是必要的。 同意 - 我已经把它变得复杂并决定简化。 @scottm 感谢您的帮助

以上是关于具有对 C# 的整数引用的元帅结构的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 数组对 Enumeration 使用引用类型,而 List<T> 使用可变结构?

c#如何将结构的引用添加到数组或列表?

C#数据类型

VS2010中的元帅结构指针

.net:C#的委托

C# 表格输出 关于引用 Aspose.Cells. 求解答疑惑