C# 使用枚举封送类

C# 使用枚举封送类,c#,enums,c++-cli,marshalling,C#,Enums,C++ Cli,Marshalling,我在将带有enum成员的类从c++/cli编组到c#时遇到问题,由于读取冲突而导致崩溃 在我的c++/cli项目中,我有: public enum ExtensionType { Primary, Secondary } public ref class Data { public: String^ Descriptor; ExtensionType ExtensionType; } 然后我在C#中声明匹配类型: 然后我尝试将其封送: _data = (Data)Marshal

我在将带有
enum
成员的类从c++/cli编组到c#时遇到问题,由于读取冲突而导致崩溃

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

public enum ExtensionType { Primary, Secondary }
public ref class Data {
public:
    String^ Descriptor;
    ExtensionType ExtensionType;
}
然后我在C#中声明匹配类型:

然后我尝试将其封送:

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

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

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

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


您使用的
Marshal.PtrToStructure
是非常错误的。这用于封送非托管类型,通常在使用p/invoke时。这里有纯托管类型,因此没有位置放置
marshall.PtrToStructure

谢谢您的输入!但也许我的最小样本太小了。。。场景是应用程序挂接/注入。代码中发生了很多事情,所以要解决这个问题有点困难,但是当我没有枚举时,它会起作用。我没有编写原始代码,而是编写了
PtrToStructure
,但它看起来确实可以按原样工作(只要两侧的类都相同)。在我花时间回答问题后,在评论中提供所有重要细节并不公平。无论如何,我的答案仍然有效。你不需要复制名称相同、外观相同但事实上不同的类型。大卫:很抱歉。由于我是编组/互操作领域的一位新手,所以我不确定哪些部分是相关的。我必须尝试删除重复的类型,看看是否有效。
_data = (Data)Marshal.PtrToStructure(dataPointer, typeof(Data));