Laden...

header/Cpp - dateien mit c# nutzen

Erstellt von Bench vor 16 Jahren Letzter Beitrag vor 16 Jahren 8.443 Views
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 16 Jahren
header/Cpp - dateien mit c# nutzen

Hi zusammen,
sit es möglich mit c# die cpp oder header Datei eines C++ Projekts direkt zu nutzen oder braucht man da eine DLL dafür?
Falls ich da komplett daneben liege, bitte um erklärung!🙂

Danke Bench

N
335 Beiträge seit 2006
vor 16 Jahren

Hallo Bench,

In C# gibt es keine Header-Files mehr.
Wenn du eine Library in C oder C++ nutzen möchtest, benötigst du P/Invoke.

Mfg NeuroCoder

Gelöschter Account
vor 16 Jahren

einfach die cpp datei nehmen geht in c# nicht. dazu benötigst du leider die komplette dll

V
86 Beiträge seit 2008
vor 16 Jahren

Oder du hast es als Projekt eingebunden und das C++ ist Managed, dann kannst du die Befehle auch direkt benutzen.
Dazu musst du aber die Datentypen beachten, schau einfach mal :rtfm: nach marshal_as, da gibt es auch eine Auflistung und eine gute Beschreibung

308 Beiträge seit 2005
vor 16 Jahren

Wenn es sich um managed C++ handelt einfach compilieren und mit dem Reflector in C# umwandeln.

Wenn es legacy Win32 Code ist kannst du den C++ code auch in C# übertragen. Ist in vielen Fällen sinvoll (vor allem, wenn mein kein p/invoke oder unsafe haben will).
Erfordert aber ein wenig mühe.

Die Dll Geschichte würde ich an deiner stelle vermeiden, da Du dann auch die C-Runtime/MfC/Atl etc. mit deployen musst. Und das kann echt nervig werden und widerspricht der Idee von .NET.

B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 16 Jahren

Hi,

ok erstmal danke!!

Das Problem ist dass ich eine Masse an C++ Borland 5.0 cpps und header Dateien habe und nun der Umstieg auf C# bevorsteht!
Bin in C# schon recht fit, aber das Problem ist jetzt, dass die ganzen alten Projekte benutzt werden müssen und ich am überlegen bin ob ich die ganzen Dateien neu in C# schreiben soll (dauert ungefähr 2 Jahre...) oder ob man halt bei bedarf diese nur ins c#-Projekt einbinden soll!

Habe leider keine Ahnung ob das managed Dateien sind!?Wie find ich das raus?

Habt ihr vielleicht einen Lösungsvorschlag für mich?

danke Bench

179 Beiträge seit 2006
vor 16 Jahren

Hi,

Schau dir mal SWIG (Simplified Wrapper and Interface Generator) an, es erstellt automatisch Wrapper um C/C++ Code, damit du es in C# nutzenn kannst.
Ich habe selbst noch nichts damit "umgewandelt", aber eine Bibliothek eines aktuellen Projekts von mir wurde in C++ geschrieben und ich verwende den durch Swig erstellten Wrapper.

greets dechavue

B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 16 Jahren

Hi,

ok klingt nicht schlecht, aber das muss halt dann acuh 100%ig funktieren!!!
Denk dass ich das dann lieber selber schreibe!!

Hat vielleicht jemand anderes noch ne Idee?

danke Bench

V
86 Beiträge seit 2008
vor 16 Jahren

Das ist die Beste Idee mit den Wrappern, falls dus umständlich magst, kannst du natürlich auch mit DllImport arbeiten. Aber sonst fällt mir momentan keine andere Möglichkeit ein (ich selbst hatte das gleiche Problem, hab mir aber einen eigenen Wrapper gebastelt, und dann auf die managed C++ Datei direkt zugegriffen, funktioniert wunderbar 😉).

308 Beiträge seit 2005
vor 16 Jahren

Das ist die Beste Idee mit den Wrappern, falls dus umständlich magst, kannst du natürlich auch mit DllImport arbeiten. Aber sonst fällt mir momentan keine andere Möglichkeit ein (ich selbst hatte das gleiche Problem, hab mir aber einen eigenen Wrapper gebastelt, und dann auf die managed C++ Datei direkt zugegriffen, funktioniert wunderbar 😉).

Dem würde ich widersprechen wollen:
Die beste Idee ist portieren! (Meisten...9

  • Warum willst Du zwei Programmiersprachen warte?
  • Warum willst Du portabilität aufgeben?
  • Warum willst Du keine 64bit fähigkeit ohne rewrite des CPP codes?

Wenn das Erstellen der CPP Codes 2 Jahre gedauert hat, wird das portieren deutlich kürzer dauern. Die dauer hängt maßgeblich von der Komplexität, dem Umfang (Lines of Code) und der Nutzung von Win32, MFC und STL ab...
Aber zwei C++ und C# weiter entwickeln zu müssen solltest Du dir zweimal überlegen. Alleine die Installation der Bibliotheken (CRT MFC etc.) kann sehr nervig sein.

Wartung? Es wird immer ein C++ Programmierer nötig sein!
Debugging? Geht, aber der ewige Übergang von Native zu Manged nervt.

Letzttlich solltest Du eine rationale Entscheidung auf Basis von Vor- und Nachteilen fällen.

Evtl. solltest Du mal erklären um was für Code es sich handelt?
GUI?
Reine Algorythmen?
Hardwaretreiber?

Und wer ist dein Zeilpublikum? Wie soll die Wartung erfolgen etc....
Wie lang ist der geplante life-cycle des neuen Programms?

Viele Fragen und daher auch keine einfache Antwort 😉

V
86 Beiträge seit 2008
vor 16 Jahren

Dem würde ich widersprechen wollen:
Die beste Idee ist portieren! (Meisten...9

  • Warum willst Du zwei Programmiersprachen warte?
  • Warum willst Du portabilität aufgeben?
  • Warum willst Du keine 64bit fähigkeit ohne rewrite des CPP codes?

Wenn das Erstellen der CPP Codes 2 Jahre gedauert hat, wird das portieren deutlich kürzer dauern. Die dauer hängt maßgeblich von der Komplexität, dem Umfang (Lines of Code) und der Nutzung von Win32, MFC und STL ab...
Aber zwei C++ und C# weiter entwickeln zu müssen solltest Du dir zweimal überlegen. Alleine die Installation der Bibliotheken (CRT MFC etc.) kann sehr nervig sein.

Wartung? Es wird immer ein C++ Programmierer nötig sein!
Debugging? Geht, aber der ewige Übergang von Native zu Manged nervt.

Letzttlich solltest Du eine rationale Entscheidung auf Basis von Vor- und Nachteilen fällen.

Das Problem stellt sich, wenn du von außerhalb Code verwendest, der 15 Jahre Entwicklungszeit hatte und es allein schon ca. 50mb Code sind... Das zu portieren wäre zwar deutlich schneller erledigt (weniger Entwicklungszeit + vorhandene Algorithmenstruktur), aber würde dennoch auch einige Zeit dauern... Ich hab das eben nur für den externen Code gelöst, im Prinzip eine Schnittstelle zwischen den beiden Paketen, und diese Schnittstelle sollte später auch nicht mehr verändert werden. Die komplette Anwendung die dieses "Toolkit" genutzt hat, wird aber neu geschrieben, nur eben das Toolkit an sich nicht.
Ob es sich danach lohnt, die großen Berechnung (kann bis zu nen GB 2D Bilder enthalten die in ein 3D Modell übertragen werden, bei Bedarf und Datensatz auch 4D) immer noch in C++ zu lösen, oder ob es nicht einfacher wäre die Berechnungen in C# zu schreiben wird sich durch Performancetests zeigen. Bei einer bestimmten Differenzgröße werden wir uns dann vermutlich immer noch für C++ entscheiden.

B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 16 Jahren

Hi zusammen,

erstmal danke für die vielen Antworten!

Also im Prinzip denke ich dass es auf das Portieren rausläuft, da der C-Code überschaubar ist!
Bin als Praktikumsstudent bei einer Firma, welche von C
auf C# umsteigt!
Hier wird überwiegend mit Hardware kommuniziert und das Problem ist dass man von den Harwareherstellern zumeisst eine C/C++ DLL zur kommunikation mitgeliefert bekommt!

In der Vergangenheit wurden halt spezielle Klasse in C++ geschrieben, welche die Hardware-DLL verwendet und diese einfacher darstellt!
Nun ist es quasi meine Aufgabe die vorhandenen C++ Klassen, welche die Hardware-DLLs verwenden in C# umzuschreiben!!!

In Zukunft wird dann jeder Entwickler c# benutzen und meine Klassen dann verwenden!!

Das Problem ist ja nun, dass ich eh die c/C++-Hardware-DLLs brauche und benutze!
Dann brauch ich doch eh den C-Compiler oder?
Prinzipiell sind ja die ganzen Bibliotheken in der DLL verpackt und ich kann diese ohne C-Zusatz benutzen, oder?

Also macht es in dieser Situation schon Sinn den C++-Code in C# zu portieren, oder?

Vielen Dank an euch!!

Bench

308 Beiträge seit 2005
vor 16 Jahren

Das Problem ist dass man von den Harwareherstellern zumeisst eine C/C++ DLL zur kommunikation mitgeliefert bekommt!

In der Vergangenheit wurden halt spezielle Klasse in C++ geschrieben, welche die Hardware-DLL verwendet und diese einfacher darstellt!
Nun ist es quasi meine Aufgabe die vorhandenen C++ Klassen, welche die Hardware-DLLs verwenden in C# umzuschreiben!!!

In Zukunft wird dann jeder Entwickler c# benutzen und meine Klassen dann verwenden!!

Halte ich für eine gute Entscheidung. Wenn die Klassen als Abstraktions-Layer dienen solle ist es auch sinvoll sich innerhalb des Ziel-Frameworks zu bewegen. Ein List<Info> ist für den .NET entwickler schon praktischer als ein Info++ 😉

Das Problem ist ja nun, dass ich eh die c/C++-Hardware-DLLs brauche und benutze!
Dann brauch ich doch eh den C-Compiler oder?
Prinzipiell sind ja die ganzen Bibliotheken in der DLL verpackt und ich kann diese ohne C-Zusatz benutzen, oder?
Bench

Ich vermute mal, dass die Hardwarehersteller eine native dll (egal welche sprache da zu Grunde liegt. Die könne auch direkt Assembler schreiben, wenn sie wollen) ausliefert. Dazu kommt wahrscheinlich eine C-Header Datei. Die sollest Du dann in C# übersetzen. Am besten eine statische Klasse, die nur dir nackten exportierten Funktionen wrapped. Und darauf setzt du dann eine saubere Wrapper Klasse auf.

B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 16 Jahren

hi,

ok dann bin ich ja nicht auf dem Holzweg!!!
vielen dank an euch!!

bench