【问题标题】:c++ cli ref class array converted to pointerc++ cli ref类数组转换为指针
【发布时间】:2017-01-03 12:07:50
【问题描述】:

我正在尝试编写一个托管包装类,以便为本地类执行互操作和转换。我在互操作库中写了类似的东西;

namespace MyNamespace {
    public ref class MyClass {
    public:
        static void MyMethod(double myArray[]);
    }
}

但是,当我从我的 C# 应用程序中引用这个库时,界面发生了变化。如果我在 C# 中的类上按 F12,我会得到重新生成的接口 MyClass [from metadata],它看起来像这样;

namespace MyNamespace {
    public class MyClass {
        public static void MyMethod(double myArray*);
    }
}

为什么编译器将数组转换为指针?如何让编译器正确地将此参数公开为数组而不是指针?

如果我想以这种方式使用该类,那么我将不得不在不安全的上下文中获取指向托管数组的指针,我不想这样做。

更新

当我在 C# 中执行 typeof(double[]) 时,我得到了;

{Name = "Double[]" FullName = "System.Double[]"}
    Assembly: {mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089}
    AssemblyQualifiedName: "System.Double[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    Attributes: Public | Sealed | Serializable
    BaseType: {Name = "Array" FullName = "System.Array"}
    ...}

所以我理解 cmets 建议我需要 System.Array。但是,我的问题仍然存在,如何在互操作类中声明 System.Double[] 数组?简单地输入MyMethod(System::Double[] myArray) 不起作用...

【问题讨论】:

  • 我可能是错的,但我相信我是正确的。它被转换为指针,因为 C++ 中的数组不使用 System.Array 来表示数组,而 C# 会这样做,在这种情况下,它只需要一个指向数据的指针。
  • 如果是这样,也许你可以用一些 .net 数组类型替换 double[] 参数。在 C++/CLI 中应该可以使用这样的类型
  • 我的问题是System.Array 是无类型的。我希望将参数解释为 double[] 而不是 System.Array
  • 我明白在原生世界中,数组和指针是同义词。但是,有一个托管 double[] 这样的东西,它可以在参数中传递,那么我如何让 ref 类将其公开为 double [] 而不是 double*

标签: c# c++ c++-cli interop metadata


【解决方案1】:

使用cli::array<double>^,它是一个托管数组。 double something[] 语法将定义一个非托管数组,该数组衰减为元数据中的指针。

请参阅here 以供参考。

【讨论】:

  • 谢谢卢卡斯,这更像是我正在寻找的。但是,我尝试替换它并收到消息“此处不允许使用 C++/CLI 数组类型”。它允许std::array,但我不认为这是我要找的...
  • 我尝试使用std::array。我必须指定等级,例如array<double, 1>。这仍然不起作用,因为我收到另一个错误“不允许使用不完整类型”。
  • @Steztric 你确定你没有省略最后的^吗?您也可以尝试删除cli::。不幸的是,我目前手头没有编译器,所以我无法检查自己。 std::array 是完全不同的东西,你不能在 C# 中使用它。
猜你喜欢
  • 2014-01-01
  • 2010-11-19
  • 2021-09-20
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多