2013-01-08 10 views
5

Próbuję wywołać istniejącą bibliotekę C++ z aplikacji języka C# za pomocą warstwy interakcji C++/CLI. Mam C++ funkcja, która wygląda mniej więcej tak:System :: IntPtr do int * w C++/CLI

void doSomething(int* foo, int size); 

a obiekt C#, która posiada dwa pola, to początek IntPtr i rozmiaru int. Napisałem C klasy zarządzanej ++, który wygląda tak:

public ref class Wrapper { 
public: 
    void run(System::IntPtr itn, int size); 
}; 

A teraz chcę zadzwonić doSomething w otoki :: biegu i mają doSomething mieć dostęp do tego samego bloku danych, że punkty C# sprzeciw wobec. Czy to, co próbuję zrobić bez kopii, a jeśli tak, to w jaki sposób?

+0

pewno oznaczało napisać, że jako 'void run (int% ITN, int size) '? Jeśli nie, to pamięć musi być przypięta przez kogoś. Czy ** nie ** zignoruj ​​to wymaganie, najlepiej zrobić to w C++/CLI z pin_ptr <>, aby kod C# mógł po prostu użyć int []. –

+0

Przepraszam, jestem nowy w CLI i C#, jestem w większości zaznajomiony z C++ i C. Co robi przypinanie pamięci? –

Odpowiedz

3

Aby połączyć doSomething z Wrapper :: metę, spróbuj odlewania powrót System::IntPtr::ToPointer, tak:

doSomething(reinterpret_cast<int*>(itn.ToPointer()), size);