我有一个托管的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'的第一个参数(您是否缺少using指令或程序集引用?)


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

public class ClassContainingStruct : MyBase
{
        public ValueType m_strucOuter_InClassContainingStruct;
        ....
        [HandleProcessCorruptedStateExceptions]
        protected override void Dispose(bool value);
}



为什么将其称为ValueType而不是StructOuter类型
为什么在尝试访问ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter时出现编译错误

最佳答案

您没有正确声明它。值类型的变量不应使用^帽子声明。这将创建一个始终装箱的值类型值。 C#不能理解,它没有等效的语法,只能将其映射到System.ValueType。仅在参考类型上使用帽子。您还忘记了将变量声明为public。固定:

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


与C#中一样,您应该改为使用属性访问器。

关于c# - 从C#访问托管C++结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24558585/

10-12 00:13
查看更多