2014-09-29 4 views
1

Я пытаюсь обернуть класс C++ в C++/cli, скелет класса ниже.Обтекание C++-функции, которая принимает int * в C++/cli

public class UnmanagedClass{ 
    //... 
    // This function stores the size in the x and y values 
    int GetSize(int* x, int* y); 
}; 

Я хочу, чтобы сделать управляемый класс, который оборачивает этот класс, так что я попытался следующие:

public ref class ManagedCode{ 
    UnmanagedClass* _pUnamangedClass; 
    //... 

    int GetSize(int% x, int% y){ 
     return _pUnmanagedClass->GetSize(&x,&y) 
     // Also Tried 
     // return _pUnmanaged->GetSize(x,y) 
    }; 
}; 

Я получаю сообщение об ошибке: «internal_ptr несовместим с типом параметра„междунар *“»

return _pUnmanagedClass->GetSize(&x, &y) 

Любые идеи о том, где я ошибаюсь.

ответ

2

Прошедшие аргументы x и y могут быть членами управляемого объекта. Когда сборщик мусора перемещает этот объект в то время, когда выполняется собственный код, а затем удары бедствия, нативный код разлагает кучу GC. Компилятор обнаруживает это и запрещает код.

Вы должны указать нативный код с устойчивым адресом. Подобно локальной переменной функции, хранящейся в фрейме стека. Не очень, но это решает проблему:

int GetSize(int% x, int% y){ 
     int xcopy = x; 
     int ycopy = y; 
     int retval = _pUnmanagedClass->GetSize(&xcopy, &ycopy); 
     x = xcopy; 
     y = ycopy; 
     return retval; 
    } 

Или сделать этот вид как .NET кода, который любой C# программист будет знать, как использовать, я должен угадать возвращаемое значение намерения:

Size GetSize() { 
     int w, h; 
     if (_pUnmanagedClass->GetSize(&w, &h) != 0) throw gcnew MyInteropException; 
     return Size(w, h); 
    } 
+0

I нашел этот же ответ и разместил его прямо перед вами, но ваше объяснение, что сборщик мусора может захотеть переместить значение int%, помогает мне понять, почему синтаксис настолько уродлив. Благодаря! –

0

Я нашел решение:

int GetSize(int% x, int% y){ 
    int xVal = x; 
    int yVal = y; 

    int result = _pUnmanagedClass->GetSize(&xVal, &yVal); 

    x = xVal; 
    y = yVal; 

    return result; 
}; 

Не знаю, почему это работает, а другой нет.

Смежные вопросы