我试图编写一个托管包装类,以便对本机类执行互操作和转换。我在互操作库中写了类似的东西。
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/