我有一个托管的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);
}
答案 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;
};
这样它就会成为类的一部分,而不仅仅是对结构的引用。