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

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"}
    ...}

因此,我理解建议我需要System.Array的评论。但是,我的问题仍然存在,如何在interop类中声明System.Double[]数组?简单地将MyMethod(System::Double[] myArray)放不起作用...

最佳答案

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

请参阅here以供引用。

关于c# - C++ cli ref类数组转换为指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41443202/

10-10 00:40
查看更多