Ist es möglich, Verweise auf C# -Objekte zwischen C# - und C++ - Code ohne große Komplexität zu teilen? Oder wird das allgemein als eine schlechte Idee betrachtet?Freigeben von Objekten zwischen C# - und C++ - Code
Antwort
Die beste Lösung für die Freigabe eines C# -Objekts zwischen nativem und verwaltetem Code ist die Verwendung von COM-Interop. Dadurch können Sie eine Schnittstelle eines Objekts im Wesentlichen zwischen verwaltetem Code und der entsprechenden Signatur in C++ freigeben.
Was die Komplexität Seite der Dinge angeht. Die Mehrheit der COM-Interop-Szenarien ist einfach und wirklich nicht komplexer als die gute alte COM-Programmierung. Auf der verwalteten Seite sieht es wirklich nicht anders aus als eine normale Schnittstelle.
Sobald Sie mehrere Threads eingeführt haben oder anfangen, zwischen COM-Apartments herumzuspielen, kann es jedoch etwas knifflig werden.
Nach meiner Erfahrung ist der einfachste Weg, um das zu arbeiten, das Folgende.
- eine Schnittstelle in C# definieren, die Sie wünschen C++
- Markieren Sie die Schnittstelle mit dem ComVisible (true) attrbute verwenden, in
- Run tlbexp auf der Baugruppe, die einen TLB
- Import der TLB-Datei erzeugt in Ihr natives Projekt
Dies wird die Schnittstellendefinition in beide Ihrer Projekte erhalten. Um dies zwischen den Projekten zu übertragen, sind einige Details in Ihrer Architektur erforderlich.
Eine andere Lösung, die ich aus eigener Erfahrung empfehlen kann, ist die Verwendung einer verwalteten C++ - Schnittstelle zwischen den beiden, wenn der C++ - Code, auf den Sie zugreifen möchten, zu groß oder zu komplex ist.
Zum Beispiel verwende ich die RakNet C++ Netzwerkbibliothek in einem C# -Projekt. Die Lösungen sollen entweder eine massive Wrapper-Klasse in C# erstellen, um auf die erforderlichen C++ - Funktionen zuzugreifen, einen C++ - Wrapper um diese Funktionen erstellen, der dann als COM-Interop verwendet werden kann, oder Managed C++ (Visual C++/CLI) verwenden.
Ich entschied mich für Letzteres, was es mir erlaubt, mit C++ auf die RakNet-Bibliothek zuzugreifen, aber die erstellten Klassen können direkt in einem anderen .NET-Projekt verwendet werden. Also wurde die Hauptlogik in diesen Managed C++ - Klassen erstellt, die es mir erlauben, das .NET-Framework und einige seiner wunderbaren Funktionen zu verwenden. In meinem C# -Projekt muss ich einfach die Managed C++ - Bibliothek aufrufen, die mir alle 20 Funktionen liefert, die ich für die Ausführung benötige.
- 1. malloc und Freigeben von Speicher zwischen Threads in C
- 2. Memory Management: Freigeben von benutzerdefinierten Objekten im Konstruktor - Objective-C
- 3. C++ - Code und Objekte von C?
- 4. Freigeben von Code zwischen einer spezialisierten und nicht spezialisierten Templatestruktur
- 5. Übergabe von Daten zwischen Objekten in C#
- 6. Linux -> C++ - Code: Serialisierung von Objekten
- 7. C und C++: Freigeben von Teil eines zugewiesenen Zeigers
- 8. C-Strukturen rekursiv freigeben
- 9. Freigeben von mehrfach referenzierten Objekten
- 10. C#, können wir Inhalte von App.config zwischen Projekten freigeben?
- 11. Gleiches Koordinatensystem zwischen zwei Objekten C#
- 12. Datenstruktur von Objekten und Methoden in C#
- 13. C# Casting zwischen Objekten unterschiedlicher Typen
- 14. Zuweisen und Freigeben eines Char * in C++
- 15. Interop zwischen C++ und C#
- 16. Zuweisen und Freigeben von ausgerichtetem Speicher in C
- 17. C# Typkonvertierung zwischen nicht verwandten Objekten
- 18. Zeichenpuffer zwischen C# -String-Objekten teilen
- 19. Stapel- und Heapzuweisungen von instanziierten Objekten C++
- 20. Freigeben von Grafiken zwischen WPF und Winforms
- 21. Löschen von Objekten in C++ explizit
- 22. Muster zum Freigeben von Speicher in C?
- 23. Freigeben von Quellcode zwischen Computern
- 24. Freigeben von Daten zwischen Klassen
- 25. Konvertieren von C++ - Code in C# -Code
- 26. Wie Übertragen von Objekten zwischen Windows-Formularen in C#
- 27. C++ Unterschied zwischen '//' und '///'
- 28. XML-Darstellung von C++ - Objekten
- 29. C++ Darstellen von optionalen Objekten
- 30. C# API Entfernen von Objekten