array ^是托管堆中对象的句柄,byte *是指向非托管字节的指针。您不能在它们之间进行投射,但可以修复托管数组并获取指向其内的元素的指针。
编辑响应第一评论:
下面是this page MSDN上
采取了代码示例,你最感兴趣的位是无效的load()方法。在这里,他们钉住阵列,并采取一个指针,其中的第一个元素...
// pin_ptr_1.cpp
// compile with: /clr
using namespace System;
#define SIZE 10
#pragma unmanaged
// native function that initializes an array
void native_function(byte* p) {
for(byte i = 0 ; i < 10 ; i++)
p[i] = i;
}
#pragma managed
public ref class A {
private:
array<byte>^ arr; // CLR integer array
public:
A() {
arr = gcnew array<byte>(SIZE);
}
void load() {
pin_ptr<byte> p = &arr[0]; // pin pointer to first element in arr
byte* np = p; // pointer to the first element in arr
native_function(np); // pass pointer to native function
}
int sum() {
int total = 0;
for (int i = 0 ; i < SIZE ; i++)
total += arr[i];
return total;
}
};
int main() {
A^ a = gcnew A;
a->load(); // initialize managed array using the native function
Console::WriteLine(a->sum());
}
你能否提供这样的解决方案吗? – Andy 2011-05-10 10:31:08
这是针对Visual Studio 2003的。[此处](http://msdn.microsoft.com/zh-cn/library/1dz8byfh%28v=vs.80%29.aspx)是Visual Studio 2005及更多版本的链接,它使用'pin_ptr'('__pin'不再支持) – 2011-05-10 11:06:06
我修改了帖子更新的示例+链接,感谢您指出我的错误:) – MattDavey 2011-05-10 12:20:14