具有对 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# 中创建这种结构并将其编组?会不会是结构中的Int32
和IntPtr
,而IntPtr
指向Int32
?
如果它引用结构中的一个字段,为什么还要麻烦呢?这似乎有悖常理。
实际问题有多个嵌套结构,它们共享公共值,通过引用链接。
您的问题需要更新。您需要明确说明您希望在 C# 代码中初始化引用。
【参考方案1】:
这应该可行:
[StructLayout(LayoutKind.Sequential)]
public struct MyCStruct
public int a;
public IntPtr b;
【讨论】:
结构体中将b
设为常量/只读,在构造函数中初始化为指向a
是否合理?
你会如何建议这样做?当您从 C++ 编组它时,b 将是非托管指针地址。
对,我在想什么,呵呵。我喜欢在托管方面将其设为私有的想法。
我相信这种布局会满足您的需要,但是当您在托管端构建其中一个时,您将不得不在本机代码中分配和初始化此结构,并将其编组回来。如果我这样做,我会将其设为内部私有结构并使用托管属性包装访问。如果是新开发,这对我来说似乎很复杂,但如果适应本机现有代码,这可能是必要的。
同意 - 我已经把它变得复杂并决定简化。 @scottm 感谢您的帮助以上是关于具有对 C# 的整数引用的元帅结构的主要内容,如果未能解决你的问题,请参考以下文章