none
C++ Wrapper für C# RRS feed

  • Frage

  • Hallo,

    ich versuche zur Zeit eine DLL und ein Headerfile eines Sensors, welche für C++ geschrieben worden sind, über einen Wrapper in C# zu nutzen (in erster Linie wegen der guten Möglichkeit dort eine GUI zu entwickeln).
    Dazu habe ich dieses Tutorial gefunden:

    https://drthitirat.wordpress.com/2013/06/03/use-c-codes-in-a-c-project-wrapping-native-c-with-a-managed-clr-wrapper/

    Ich habe auch schon ein Beispielprogramm entwickelt und das lief tadellos. Deswegen habe ich mich nun dran gemacht um den Sensorcode einzubinden.

    Dafür habe ich mir eine neue Klasse gemacht um die Funktionen zu portieren (erst einmal nur mit einer Methode):

    class iSysFunktionen
    {
    	public:
    		int Connect(uint8_t IP1, uint8_t IP2, uint8_t IP3, uint8_t IP4);
    	private:
    		iSYSHandle_t Sensor_Handle;
    };

    Dann habe ich mir ein neues Projekt gemacht (VC++ CLR) und dort ebenfalls eine Klasse definiert:

    using namespace System;
    
    namespace iSys 
    {
    	public ref class iSysWrapper
    	{
    		public:
    			iSysWrapper();
    			int Connect(uint8_t IP1, uint8_t IP2, uint8_t IP3, uint8_t IP4);
    		private:
    			iSysFunktionen *WrapperClass;
    	};
    }

    Der Build läuft auch durch, allerdings bekomme ich folgende Warnung:

    warning LNK4248: Nicht aufgel÷stes Typeref-Token (0100000C) f³r "iSYSHandle". Das Image kann m÷glicherweise nicht ausgef³hrt werden.

    Wenn ich die erzeugte DLL nun in meine GUI einbinde und diese starte, kommt ein Fehler.
    Wenn ich allerdings im C++ Code die Variable 

    iSYSHandle_t Sensor_Handle;

    auskommentiere, verschwindet die Warnung im Wrapper und die GUI erzeugt keinen Fehler mehr.
    Von daher muss das irgendwie an der Variable liegen, aber ich finde einfach keine Lösung für das Problem.
    Gibt es evtl. Probleme mit eigenen Structs die definiert worden sind?

    Danke für eine Antwort.

    Mittwoch, 8. Juli 2015 06:29

Antworten

  • Hallo,
    meines Wissens nach kann C# nicht mit C++ Instanzen von Klassen oder Strukturen umgehen.

    Die einfachste Lösung für diese Problem ist meiner Ansicht nach, wenn du dir einen Wrapper mit C++\CLI schreibst und diesen Wrapper in C# verwendest. Alterantiv lässt da bestimmt auch was über COM machen. Aber "nativ" in C# wird es nicht gehen.


    Viele Grüße Holger M. Rößler

    Mittwoch, 8. Juli 2015 07:11
  • Hallo,

    ich vermute , dass deine C++ Native Dll beim Linken nicht gefunden wird.

    Wofür brauchst Du noch die Klasse iSysFunktionen?  Du brauchst  nur eine C++/ CLI Wrapper Klasse (normalerweise als eine DLL), die einen Zeiger auf einen Objekt der Native C++ Klasse und die Methoden, die die Methoden aus C++ Native Klasse kapseln, enthält.

    Hier gibt es noch eine Beschreibung wie man die Native Dll im Managed Projekt verwenden kann.



    Mittwoch, 8. Juli 2015 09:20
  • Hallo Holger,

    ich habe das nun über C++/CLI gelöst.
    Quasi genau wie auf dieser Seite hier:

    http://www.codeproject.com/Articles/651516/Exposing-native-to-managed-Cplusplus-CLI-vs-P-Invo





    Mittwoch, 8. Juli 2015 11:00

Alle Antworten

  • Hallo,
    meines Wissens nach kann C# nicht mit C++ Instanzen von Klassen oder Strukturen umgehen.

    Die einfachste Lösung für diese Problem ist meiner Ansicht nach, wenn du dir einen Wrapper mit C++\CLI schreibst und diesen Wrapper in C# verwendest. Alterantiv lässt da bestimmt auch was über COM machen. Aber "nativ" in C# wird es nicht gehen.


    Viele Grüße Holger M. Rößler

    Mittwoch, 8. Juli 2015 07:11
  • Hallo,

    danke für die Antwort. Ich habe bereits versucht den Wrapper über C++/CLI zu realisieren, nur dabei entsteht leider diese Meldung :(

    Alternativ gibt es für den Sensor auch eine fertige DLL. Diese kann ich allerdings nicht direkt in C# einbinden.
    Gibt es eine Möglichkeit nur diese DLL über CLI oder so in C# verfügbar zu machen?
    • Bearbeitet Kampino89 Mittwoch, 8. Juli 2015 07:26
    Mittwoch, 8. Juli 2015 07:24
  • Hallo,

    ich vermute , dass deine C++ Native Dll beim Linken nicht gefunden wird.

    Wofür brauchst Du noch die Klasse iSysFunktionen?  Du brauchst  nur eine C++/ CLI Wrapper Klasse (normalerweise als eine DLL), die einen Zeiger auf einen Objekt der Native C++ Klasse und die Methoden, die die Methoden aus C++ Native Klasse kapseln, enthält.

    Hier gibt es noch eine Beschreibung wie man die Native Dll im Managed Projekt verwenden kann.



    Mittwoch, 8. Juli 2015 09:20
  • Hallo,

    Problem ist gelöst...es fehlten ein paar DLLs im GUI Verzeichnis, die ich allerdings die ganze Zeit in den falschen Debug Ordner kopiert hatte....nachdem ich die DLLs in x86/Debug kopiert habe, hat es direkt geklappt....

    Danke trotzdem für die Hilfe!

    Mittwoch, 8. Juli 2015 10:18
  • Hallo,
    wie hast du es jetzt gelöst? Über C++\CLI?

    Viele Grüße Holger M. Rößler

    Mittwoch, 8. Juli 2015 10:34
  • Hallo Holger,

    ich habe das nun über C++/CLI gelöst.
    Quasi genau wie auf dieser Seite hier:

    http://www.codeproject.com/Articles/651516/Exposing-native-to-managed-Cplusplus-CLI-vs-P-Invo





    Mittwoch, 8. Juli 2015 11:00