我有一个托管的 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 编译时报如下错误:
Error 1 'System.ValueType' does not contain a definition for 'm_int_InStructOuter' and no extension method 'm_int_InStructOuter' accepting a first argument of type 'System.ValueType' could be found (are you missing a using directive or an assembly reference?)
当我尝试在 C# 应用程序上定义 ClassContainingStruct 类时 它定义如下(根据元数据):
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/