C# 访问托管C++;来自C的结构# 我有一个托管C++ DLL,包含以下的 public value struct StructOuter { public: int m_int_InStructOuter; }; public ref class ClassContainingStruct : MyBase { public: StructOuter^ m_strucOuter_InClassContainingStruct; };

C# 访问托管C++;来自C的结构# 我有一个托管C++ DLL,包含以下的 public value struct StructOuter { public: int m_int_InStructOuter; }; public ref class ClassContainingStruct : MyBase { public: StructOuter^ m_strucOuter_InClassContainingStruct; };,c#,c++-cli,managed,C#,C++ Cli,Managed,从“C#”应用程序,我尝试访问以下托管DLL: 我收到基类类型的对象,我正在将其转换为派生类 反对意见如下 ClassContainingStruct ccs = (ClassContainingStruct)base; 当我试图打印ccs的内容时, ccs.m_结构,包括容器结构 由Intellisense向我显示为ValueType。 这是正确的,但如果尝试访问ValueType的内容,即m_int_ i、 e.ccs.m_结构,包括内部结构和外部结构 编译期间报告了以下错误: 错误1“

从“C#”应用程序,我尝试访问以下托管DLL: 我收到基类类型的对象,我正在将其转换为派生类 反对意见如下

ClassContainingStruct  ccs = (ClassContainingStruct)base;
当我试图打印ccs的内容时, ccs.m_结构,包括容器结构 由Intellisense向我显示为ValueType。 这是正确的,但如果尝试访问ValueType的内容,即m_int_ i、 e.ccs.m_结构,包括内部结构和外部结构 编译期间报告了以下错误:

错误1“System.ValueType”不包含“m_int_InStructOuter”的定义,并且找不到接受“System.ValueType”类型的第一个参数的扩展方法“m_int_InStructOuter”(是否缺少using指令或程序集引用?)

当我尝试在C#应用程序中定义ClassContainingStruct类时 定义如下(根据元数据):

  • 为什么它被称为ValueType而不是StructOuter类型
  • 为什么我在尝试访问ccs.m_strucOuter_InClassContainingStruct.m_int_时出现编译错误

  • 我认为您应该删除
    ^
    ,如下所示:

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

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

    您没有正确声明它。值类型的变量不应使用^hat声明。这将创建一个始终装箱的值类型值。C#无法理解,它没有等价的语法,只能将其映射到System.ValueType。仅在引用类型上使用hat。您还忘了声明变量public。修正:


    就像在C#中一样,您应该更喜欢属性访问器。

    #现在添加了public。谢谢我认为hat^可以用作一个概念,表示它是指向值类型的指针,而不是引用类型。这不是真的吗?是否有方法指定指向值类型的指针?否,^hat指定对存储在垃圾收集堆上的对象的引用。它的生存期由GC自动管理。StructOuter值已存储在堆上,因为其容器ClassContainingStruct是引用类型。从技术上讲,使其成为指针是可能的,您必须将其声明为StructOuter*。但它是危险的,许多.NET语言无法使用它。管理指针是您的工作,您必须有一个析构函数和一个终结器来释放内存。这不太可能是你想要的。
    public ref class ClassContainingStruct : MyBase
    {
       StructOuter m_strucOuter_InClassContainingStruct;
    };
    
    public ref class ClassContainingStruct : MyBase
    {
    public:
       StructOuter m_strucOuter_InClassContainingStruct;   // Note: no hat
    };