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#”应用程序,我尝试访问以下托管DLL: 我收到基类类型的对象,我正在将其转换为派生类 反对意见如下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“
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类时
定义如下(根据元数据):
我认为您应该删除
^
,如下所示:
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
};