РЕДАКТИРОВАТЬ: Исправлен ответ, см. Ниже.
На самом деле вам нужно знать, что oldFunction собирается делать с pStuff. Если pStuff - указатель на некоторые неуправляемые данные, вы можете попробовать обернуть определение m_pStuff следующим образом:
#pragma unmanaged
void* m_pStuff
#pragma managed
Это сделает указатель неуправляемым, который затем может быть передан в неуправляемые функции. Конечно, вы не сможете назначить какие-либо управляемые объекты этому указателю напрямую.
Принципиально неуправляемые и управляемые указатели не совпадают и не могут быть преобразованы без какого-либо связующего кода, который копирует лежащие в основе данные. В основном управляемые указатели указывают на управляемую кучу, и, поскольку это сборщик мусора, фактический адрес памяти, на который они указывают, может со временем меняться. Неуправляемые указатели не изменяют адрес памяти без вашего явного указания.
Поцарапайте это, вы не можете определить неуправляемый / управляемый внутри определения класса. Но этот тестовый код работает нормально:
// TestSol.cpp : main project file.
#include "stdafx.h"
using namespace System;
#pragma unmanaged
void oldFunction(void** pStuff)
{
return;
}
#pragma managed
ref class Test
{
public:
void* m_test;
};
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
Test^ test = gcnew Test();
void* pStuff = test->m_test;
oldFunction(&pStuff);
test->m_test = pStuff;
return 0;
}
Здесь я сначала копирую указатель из управляемого объекта, а затем передаю его в oldFunction. Затем я копирую результат (возможно, обновленный oldFunction) обратно в управляемый объект. Поскольку управляемый объект находится в управляемой куче, компилятор не позволит вам передать ссылку на указатель, содержащийся в этом объекте, поскольку он может перемещаться при запуске сборщика мусора.