【问题标题】:Accessing Managed C++ Struct from C#从 C# 访问托管 C++ 结构
【发布时间】:2014-07-03 16:06:38
【问题描述】:

我有一个托管 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”的定义,并且找不到接受“System.ValueType”类型的第一个参数的扩展方法“m_int_InStructOuter”(您是否缺少 using 指令或程序集参考?)

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

public class ClassContainingStruct : MyBase
{
        public ValueType m_strucOuter_InClassContainingStruct;
        ....
        [HandleProcessCorruptedStateExceptions]
        protected override void Dispose(bool value);
}
  1. 为什么它被称为 ValueType 而不是 StructOuter 类型
  2. 为什么当我尝试访问 ccs.m_strucOuter_InClassContainingStruct.m_int_InStructOuter 时出现编译错误

【问题讨论】:

    标签: c# c++-cli managed


    【解决方案1】:

    您没有正确声明它。值类型的变量应该用 ^ 帽子声明。这会创建一个始终被装箱的值类型值。不是 C# 理解的东西,它没有等效的语法,它只能将其映射到 System.ValueType。仅在引用类型上使用帽子。你也忘了声明变量public。修复:

    public ref class ClassContainingStruct : MyBase
    {
    public:
       StructOuter m_strucOuter_InClassContainingStruct;   // Note: no hat
    };
    

    与在 C# 中一样,您应该改用属性访问器。

    【讨论】:

    • #现在公开。谢谢!我认为帽子 ^ 可以用作一个概念来提及它是指向值类型的指针,而不是引用类型。这不是真的吗?有没有办法指定指向值类型的指针?
    • 不,^ 帽子指定对存储在垃圾收集堆上的对象的引用。它的生命周期由 GC 自动管理。 StructOuter 值已经存储在堆上,因为它的容器 ClassContainingStruct 是一个引用类型。使其成为指针在技术上是可行的,您必须将其声明为 StructOuter*。但它很危险,许多 .NET 语言无法使用它。管理指针是你的工作,你必须有一个析构函数和一个终结器来释放内存。这不太可能是您想要的。
    【解决方案2】:

    我认为你应该像这样删除^

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2012-10-17
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多