我有一个托管的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/