В C# используется IntPtr для представления выделенной извне памяти. Указатели и ссылки C# могут использоваться только с памятью, предоставляемой сборщиком мусора.
Класс System.InteropServices.Marshal предоставляет некоторые методы взаимодействия с областями памяти, представленными IntPtr, конечно, они не являются типичными.
Но я ничего не вижу в вашей функции, которая могла бы вернуть указатель на выделенную память. Вам понадобится аргумент с двумя указателями или возвращаемое значение указателя, и у вас их нет.
EDIT, чтобы добавить пример по запросу:
// 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 arrays (cli :: array), так и управление собственной памятью, что делает эту задачу очень простой. –
но как я могу это сделать? .. какой-нибудь пример ??? – Manjoor