从C#访问托管C ++ Struct

时间:2014-07-03 16:06:39

标签: c# c++-cli managed

我有一个托管的C ++ dll,其中包含以下内容

public value struct StructOuter
{
   public:
      int m_int_InStructOuter;
};

public ref class ClassContainingStruct : MyBase
{
   public:
          StructOuter^ m_strucOuter_InClassContainingStruct;
};

来自" C#"应用程序,我试图访问托管DLL的以下内容: 我收到基类类型对象,我将转换为派生类 对象如下。

ClassContainingStruct  ccs = (ClassContainingStruct)base;

当我尝试打印ccs的内容时,     ccs.m_strucOuter_InClassContainingStruct Intellisense向我显示ValueType。 这是真的,但如果尝试访问ValueType的内容,即m_int_InStructOuter 即ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter 编译期间报告以下错误:

  

错误1' System.ValueType'不包含' m_int_InStructOuter'的定义没有扩展方法' m_int_InStructOuter'接受类型为System.ValueType'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

当我尝试在ClassContainingStruct类的C#应用​​程序上进行定义时 它定义如下(根据元数据):

public class ClassContainingStruct : MyBase
{
        public ValueType m_strucOuter_InClassContainingStruct;
        ....
        [HandleProcessCorruptedStateExceptions]
        protected override void Dispose(bool value);
}
  1. 为什么它被称为ValueType而不是StructOuter类型
  2. 当我尝试访问ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter时,为什么我收到编译错误

2 个答案:

答案 0 :(得分:1)

你没有正确宣布。应使用^ hat声明值类型的变量 not 。这将创建一个始终装箱的值类型值。不是C#理解的东西,它没有等效的语法,它只能将它映射到System.ValueType。仅在引用类型上使用帽子。您还忘记声明变量 public 。修正:

public ref class ClassContainingStruct : MyBase
{
public:
   StructOuter m_strucOuter_InClassContainingStruct;   // Note: no hat
};

与在C#中一样,你应该更喜欢属性访问者。

答案 1 :(得分:0)

我认为您应该删除^,如此:

public ref class ClassContainingStruct : MyBase
{
   StructOuter m_strucOuter_InClassContainingStruct;
};

这样它就会成为类的一部分,而不仅仅是对结构的引用。