[C++] Portierung von unmanaged C++ nach C#

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

[C++] Portierung von unmanaged C++ nach C#

Beitrag von ponx »

hallo Leute,
hat jemand Erfahrung darin, eine unmanaged C++ Library auf C# zu portieren ?
Ich werkel seit fast 2 Tagen da rum und der Fehler-Reigen nimmt einfach kein Ende. Mein erster Ansatz war, das komplette DLL-Projekt für die Common Language Runtime zu bauen, und zusätzlich im gleichen Projekt eine Wrapper-Klasse zu implementerien. Nach endlosen Compiler- und Linkerfehlern hab ich mittlerweile "nur noch" 35 Warnings, und scheitere jetzt aber zur Laufzeit an einer System.BadImageFormatException, sobald ich meine Wrapper-Klasse instanziieren will.
Leider hab ich keine Ahnung, was den eigentlichen Fehler verursacht. Jetzt meine Frage:
Meine DLL hat ein ziemlich schlankes öffentliches Interface, das alle Funktionen in einer einzigen Klasse anbietet. Intern benutze ich aber relativ viel Zeugs, u.a. boost::Thread, boost::Serialisation, und auch von DirectX das XACT API für die Audio-Wiedergabe.
Kann diese BadImageFormatException durch eine dieser internen Komponenten verursacht werden, oder sollte das wurscht sein, solange die nicht öffentlich sind ? Sprich: Wenn ich das Problem behoben habe, besteht dann Grund zur Hoffung, dass der Rest relativ fix über die Bühne geht ? Oder kann da noch einiges mehr schief gehen ? MIr läuft momentan ein bisschen die Zeit weg, und ich bin nicht sicher, ob ich die Portierung erstmal auf Eis legen muss.

Für jeden Hinweis dankbar:
die alte frau ponx
Matthias Gubisch
Establishment
Beiträge: 472
Registriert: 01.03.2009, 19:09

Re: [C++] Portierung von unmanaged C++ nach C#

Beitrag von Matthias Gubisch »

Hallo

du kannst C++ Code der in nativen C++ geschrieben ist im Normalfall nicht einfach mit der CLR compilieren. Das wird nicht funktionieren

Vom Prinzip her funktioniert das folgendermaßen:
-Dein Code wird ganz nomal native compiliert
-Dann erzeugst du Wrapper klassen die du in managed C++ schreibst für alle Klassen die du Portieren willst

Diese machen nichts anders als die entsprechenden nativen Funktionen aufzurufen und die Datentypen in die entsprechenden managed Datentypen zu konvertieren

Je nachdem wie Umfangreich dein Projekt ist macht es vielleicht Sinn das ganze zu Automatisieren.

Ein gutes Tool dafür ist zum Beispiel SWIG.

Diese Exception hatte ich beim Managed Wrapper für Assimp auch mal
Gelegen hatte es letztendlich an irgendwelchen Visual Studio Projekteinstellungen
welche genau kann ich nicht sagen da nach endlosen Suchen einfach das gesamte Projekt neu aufgesetzt wurde mit dem Ergebniss dass die Exception verschwunden war.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: [C++] Portierung von unmanaged C++ nach C#

Beitrag von Helmut »

Wenn deine native DLL ein sauberes Interface anbietet (am besten reines C) sollte die Nutzung von .NET aus doch keine Probleme bereiten?

Die BadImageException tritt auf, wenn LoadLibrary fehlschlägt. Vielleicht passt die Architektur der DLL nicht (.NET Dlls können fast überall laufen, native DLLs nur auf einer), DllMain gibt false zurück, eine importierte Funktion konnte nicht geladen werden oder eine andere DLL, von der deine native DLL abhängt, konnte nicht geladen werden. Vielleicht auch eine eklige Manifest Sache... Da LoadLibrary keine Fehlerinformationen liefert muss man ausprobieren, woran es nun genau liegt...

Ciao
Helmut
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: [C++] Portierung von unmanaged C++ nach C#

Beitrag von ponx »

Vielen Dank für eure Antworten !
Ok dann werde ich im nächsten Anlauf den Wrapper in ein getrenntes Projekt packen, und dann nur dieses Projekt mit /CLR bauen. Vielen Dank auch für den Tipp mit SWIG, das guck ich mir mal an !
@Helmut: Unser Interface ist C++, aber so sauber wie es eben geht. D.h. ich benutze fast nur Basistypen und übergebe keine Objekte per value, und die Library benutzt oder deleted auch nichts, was sie nicht selber allokiert hat, d.h. ich hab jeweils Klassenmethoden zum Erzeugen und Freigeben der öffentlichen Objekte. Gibt's da sonst noch eine Falle, in die ich laufen kann ? Ansonsten geh ich dann mal weiter auf Fehlersuche..! Danke nochmal! Ihr habt schon sehr geholfen

viele Grüße,
ponx
Antworten