【发布时间】: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