2010-06-30 13 views
11

Podczas wyszukiwania sposobu na współdziałanie C# i C++ znalazłem ten article, który wyjaśnia o P/Invoke.Współdziałanie C++ i C#: P/Invoke vs C++/CLI

I czytam dużo artykułów twierdzących, że C++/CLI nie jest dokładnym C++ i wymaga pewnego wysiłku, aby zmodyfikować z oryginalnego kodu C++.

Chcę zapytać, jaki byłby optymalny sposób, gdy mam niektóre obiekty C++ (kod/dane), które chcę użyć z obiektów C#.

  • Wygląda na to, że aby korzystać z P/Invoke, powinienem zapewnić interfejs API w stylu C. Czy to prawda? Mam na myśli, czy istnieje sposób na eksport obiektu C++ do C# jak SWIG z P/Invoke? Czy muszę użyć SWIG do tego celu?
  • Jak trudno zmienić C++ na C++/CLI? Czy warto próbować w porównaniu do przepisywania C++ na C#? C++ jest dobrze zaprojektowany, więc implementacja go do C# nie jest świetną okazją.
  • (Wyłącz pytanie do tematu) Czy istnieje odwrotnie? Mam na myśli, jeśli chcę użyć C# kod z C++, czy jest jakiś sposób to zrobić?

Odpowiedz

18

Nie polecam przepisywania biblioteki C++ do C++/CLI. Zamiast tego napisałbym opakowanie C++/CLI, które można wywołać z C#. Będzie to składać się z kilku klas public ref class, z których każda prawdopodobnie po prostu zarządza instancją rodzimej klasy. Twoje opakowanie C++/CLI po prostu "zawiera nagłówek, link do biblioteki", aby korzystać z natywnej biblioteki. Ponieważ napisałeś klasy public ref class, Twój kod C# po prostu dodaje odniesienie do .NET. I wszystko, co robisz w każdej publicznej klasie odniesienia, to użycie C++ Interop (alias It Just Works) do wywołania natywnego kodu. Możesz zastosować elewację, gdy jesteś na niej, jeśli chcesz.

+4

+1 bezwzględnie. Zazwyczaj nie jest konieczna modyfikacja istniejącego kodu C++. –

3

W odpowiedzi na Kate Gregory, aby wywołać kod C# z C++, użycie C++/CLI jest oczywistym sposobem na zrobienie tego, ponieważ czyni go niezwykle prostym i bezproblemowym.

5

Składnia C++/CLI jest niewygodna, ale pozwala ujawnić zarządzane obiekty z kodu C++. Może to być wygodne, jeśli masz duży interfejs API języka C++ i możesz ograniczyć niektóre funkcje do prostszego interfejsu do wykorzystania przez zarządzany kod. Udało mi się to z powodzeniem do integracji z takimi narzędziami, jak biblioteka wizji Matrox, gdzie mogłem napisać mój kod analizy wizji w C++, a następnie użyć rozszerzeń C++/CLI, aby odsłonić klasy zarządzające wysokiego poziomu. Najbardziej bolesną częścią jest prawdopodobnie interakcja między ciągami i tablicami, ale ciągi zawsze były bolesne, nawet w prostym C++.

C++/CLI może zdecydowanie zużywać obiekty zarządzane przez NET, ale musisz zachować szczególną ostrożność, jeśli używasz wskaźników do zarządzania pamięcią (w tym przypadku musisz użyć przypinania). Jeśli potrzebuję przekazać wskaźniki do API, zazwyczaj wolę zachować tę pamięć niezarządzaną, a następnie utworzyć zarządzane klasy opakowania do manipulowania niezarządzaną pamięcią.

0

Zawiń swoje natywne klasy C++, jako wskaźnik do implementacji, w klasy C++/CLI, a następnie zadzwoń pod & użyj tych klas opartych na CLR, wykorzystując je w swojej aplikacji .net. To jest mój zalecany sposób. NIE NAPISUJ swoich istniejących klas w C++/CLI.