编组类与枚举

时间:2014-03-21 13:36:26

标签: c# enums c++-cli marshalling

我遇到问题,将来自c ++ / cli的enum成员的类编组到C#中,由于读取违规而导致崩溃。

在我的c ++ / cli项目中,我有这个:

public enum ExtensionType { Primary, Secondary }
public ref class Data {
public:
    String^ Descriptor;
    ExtensionType ExtensionType;
}

然后我在C#中声明匹配类型:

public enum ExtensionType { Primary, Secondary }
public class Data {
    public string Descriptor;
    ExtensionType ExtensionType;
}

然后我尝试编组:

_data = (Data)Marshal.PtrToStructure(dataPointer, typeof(Data));

此时,应用程序崩溃了。我需要在枚举上抛出一些属性吗?

1 个答案:

答案 0 :(得分:1)

您只需要声明一次类型。您要声明类型两次,因此有两种不同的类型副本。您有两个版本的枚举,一个在C ++ / CLI程序集中,另一个在C#中。你有两个版本的类,一个在C ++ / CLI程序集中,另一个在C#中。

您需要做的是添加C ++ / CLI程序集作为C#可执行文件的引用。在C ++ / CLI模块中定义类型,并在C#代码中使用它们,就像使用引用的程序集中的任何其他类型一样。或者,如果相关性是相反的,则在C#代码中声明类型,添加C#程序集作为对C ++ / CLI可执行文件的引用。

您使用Marshal.PtrToStructure是非常错误的。这是用于编组非托管类型,通常在使用p / invoke时。这里有纯托管类型,因此Marshal.PtrToStructure没有地方。