【发布时间】:2015-12-12 04:25:28
【问题描述】:
假设我在 C++ 中有以下结构
struct Base
{
USHORT size;
}
struct Inherited : public Base
{
BYTE type;
}
我想在 C# 中编组 Inherited,但结构继承在 C# 中不起作用。做以下合适吗?
public interface IBase
{
ushort Size { get; set; }
}
[StructLayout(LayoutKind.Sequential)]
public struct Inherited : IBase
{
public ushort Size { get; set; }
public byte Type { get; set; }
}
我在这里简化了问题,而且我的结构更大,因此很难验证结果。此外,这些结构来自另一个没有很好记录的软件,这使得验证结果变得更加困难。在 C++ 中使用继承时,基类字段是在子结构之前还是之后?
我使用IBase 作为强制存在基本字段的一种方式。
不幸的是,我无法控制 C++ 端(用于我集成的外部系统的 SDK)。
【问题讨论】:
-
我认为期望基本结构在 C++ 内存布局中排在第一位并不是不合理的,就好像它是第一个成员一样(但我不认为它是标准化的)。你试过了吗?
-
@TheodorosChatzigiannakis 是的,我当然尝试并运行了代码,但正如我所说:“[...]我的结构更大,因此很难验证结果。”这就是为什么我试图验证我的假设。感谢您的输入!
-
您可能应该使用字段而不是属性,但我不知道这是否可行。
-
我还建议您使用字段而不是自动属性。是的,至少只要您坚持使用 MSVC(或任何与原始 Windows SDK 兼容的编译器),您就可以假定基类字段直接位于派生类的字段之前。
-
如果你打算与 C++ 进行大量互操作,你可以看看 C++/CLI
标签: c# c++ inheritance struct marshalling