C#使用IntPtr來表示外部分配的內存。 C#指針和引用只能與垃圾收集器提供的內存一起使用。
System.InteropServices.Marshal類提供了一些用於與由IntPtr表示的本機內存區進行交互的方法,當然它們不是類型安全的。
但我沒有看到你的函數中可能返回指向已分配內存的任何內容。你需要一個雙指針參數或者一個指針返回值,而你沒有。
編輯添加的例子的要求:
// this doesn't work right
void external_alloc_and_fill(int n, int* result)
{
result = new int[n];
while (n-- > 0) { result[n] = n; }
}
extern external_alloc_and_fill(int n, int* result)
int a = 5;
fixed (int* p = &a) {
external_alloc_and_fill(17, p);
// p still points to a, a is still 5
}
更好:
// works fine
void external_alloc_and_fill2(int n, int** presult)
{
int* result = *presult = new int[n];
while (n-- > 0) { result[n] = n; }
}
extern external_alloc_and_fill2(int n, ref IntPtr result)
int a 5;
IntPtr p = &a;
external_alloc_and_fill2(17, ref p);
// a is still 5 but p is now pointing to the memory created by 'new'
// you'll have to use Marshal.Copy to read it though
您是否允許將C++ DLL編譯爲C++/CLI託管程序集? C++/CLI同時理解.NET數組(cli :: array)和本機內存管理,因此它使得這個任務變得非常簡單。 –
2010-03-08 22:20:44
但我該怎麼做?..任何例子?? – Manjoor 2010-03-09 01:38:04