Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Jt Open Toolkit mit C# nutzen
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

Themenstarter:

Jt Open Toolkit mit C# nutzen

beantworten | zitieren | melden

Hallo zusammen,

ich möchte hiermit nachfragen, ob jemand Erfahrungen mit dem Jt Open Toolkit hat. Ich möchte damit etwas experimentieren - also jt-Dateien lesen, schreiben und selbst simple jt-Dateien erzeugen.
Dazu habe ich mir die letzten Tage die 60-Tage-Trial version runter geladen und begonnen die Doku zu lesen. So wie ich das aber jetzt sehe ist das eine C++ Api. Also nichts mit C# oder .net.

Und genau hier möchte ich fragen, ob es über DllImport usw. doch möglich ist, das Toolkit zu verwenden, oder ob ich es gleich wegpacken kann. C++ will ich mehr jetzt nicht antun zu lernen. Bis da was zustande kommt sind die 60 Tage rum.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1918
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Stichwort ist hier P/Invoke.
Damit kannst du auf native Methoden in C/C++ dlls zugreifen.
Google mal danach bzw. schau mal über die Foren Suche.

Nachtrag:
Ja mit DllImport bist du auf dem richtigen Weg.
Je nachdem wie die Lib aufgebaut ist, musst du den Code eben mit DllImport auf eigene Klasse/Methoden mappen.
Musst halt nur schauen, dass die Datentypen der Methoden auch korrekt gemappt sind.
Dann sollte es aber eigentlich nur etwas Tipp aufwand sein.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Scavanger
myCSharp.de - Member

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 323

beantworten | zitieren | melden

Nunja,

wenn es wirklich C++ ist, also Objektorientiert, dann ist es mit einfachem PInvoke (= DLL-Import) nicht getan, da musst du dann mit Implicit PInvoke ran, d.H. du musst erst einen Wrapper in Managed C++ schreiben.
So ein Wrapper kann allerdings recht aufwendig werden, gerade bei einem großen Toolkit wie dem JT Open Toolkit, wäre so ein Wrapper allein ein recht großes Projekt.

Ich hab so was mal für eine recht kleine Library gemacht, alleine die Konvertierung der X Stringtypen hat mir einige Graue Haare gekostet. ;)

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Ich wäre da auch sehr skeptisch, einen Wrapper für JT Open Toolkit zu schreiben. Wir verwenden das in der Arbeit (machen aber eh nur C++, also kein Problem), ist jetzt nicht meine Baustelle, aber klein und übersichtlich kam mir das aber nicht grad vor.
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

Themenstarter:

beantworten | zitieren | melden

Hallo zusammen!

Nun ist fast ein Monat vergangen. Ich habe mich mit dem Thema weiter auseinandergesetzt und vieles dazu gelesen und ergegoogelt.
Herausgekommen ist dabei zumindest schon mal ein funktionierendes C++ Projekt (Was für eine Sprache.) X(

Was aber nun noch gar nicht so recht klappen will ist die Kommunikation zwischen C# und C++. Große Probleme bereiten mir hier String, structs und Klassen. Zahlenwerte wie Integer, Float, ... funktionieren.

Ich stelle im Anhang mein VS2013-Testprojekt zur Verfügung, das wie gesagt mit Zahlenwerten funktioniert. Den nicht funktionierenden Teil habe ich entweder auskommentiert oder wieder rausgelöscht. Aufgrund der doch sehr geringen erlaubten Größe für Dateianhänge habe ich auch einige Ordner gelöscht. Ich hoffe dass die alle wieder beim Erstellen der Projektmappe da sind!

In Anlehnung an das Kapitel 10.10 im OpenBook Visual C# 2012 möchte ich gerne ein Struct an C++ weiterleiten. Das Struct soll ungefähr so aussehen:

namespace CsTester
{
    public struct MyStruct
    {
        public string filename;
        public string destinationPath;
        public List<MyPoint> pointList;
    }
}

namespace CsTester
{
    public struct MyPoint
    {
        public string name;
        public float originX;
        public float originY;
        public float originZ;
        public float radius;
        public float colorR;
        public float colorG;
        public float colorB;
    }
}

Wenn ich nun im unsafe Block - wie im Openbook 10.10.6 beschrieben - einen Zeiger auf das struct MyStruct setze, dann erhalte ich wie bei den Strings eine Fehlermeldung.
Es ist nicht möglich, einen Zeiger für den verwalteten Typ ("string") zu deklarieren oder dessen Adresse oder Größe abzurufen.

Was wäre eurer Meinung nach der beste Weg, strings und floats in einem Rutsch von C# nach C++ zu übergeben?
Attachments
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Ich habs mir nicht angeschaut, mit unsafe würde ich aber gar nicht erst anfangen. Die üblichen Methoden, zwischen C# und C++ zu kommunizieren, wären COM oder eine Bridge in C++/CLI. Zweiteres wäre vermutlich einfacher, COM kann in C++ umständlich sein, wenn man sich nicht auskennt.
Gibt noch weitere Möglichkeiten, wie native Interop, wäre vielleicht in dem Fall auch einfacher, wenn du nur paar Structs austauschen willst.
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

Themenstarter:

beantworten | zitieren | melden

Also mein Wrapper ist eine C++/CLR Klassenbibliothek. Das dürfte dann Deiner zweiten Möglichkeit entsprechen.
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Ok, ich hab mal kurz reingeschaut. Das erste, was mir auffällt, ist dass mir der C++ Code nicht gefällt. Sowas wie Werte aufsummieren schreibt man üblicherweise nicht selber als Schleife. Eins der coolen Sachen an C++ sind die STL Algorithmen, bzw. auch ähnliche generische Algorithmen. Das wär ein Einzeiler mit std::accumulate. Und man würde auch keine FloatEngine und IntEngine schreiben, sondern Templates benutzen. Bei der StringEngine bin ich mir nicht 100% sicher (wegen möglichen Optimierungen), aber die könnte man dann notfalls als Templatespezialisierung erledigen.
Warum du überhaupt mit C Arrays rumhantierst, erschließt sich mir aus dem Beispielcode auch nicht. Ist auch überhaupt nicht üblich in C++. Ist das eine Vorgabe von OpenJt?

So, und warum brauchst du unsafe und irgendwelche Zeiger? Du kannst aus C# einfach eine List<T> übergeben, das mixed C++ kommt damit zurecht.
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

Themenstarter:

beantworten | zitieren | melden

Dass der C++ Code keinen Schönheitspreis gewinnt ist mir klar. Dieser Code ist der erste C++ Code überhaupt, den ich programmiert habe. Das ganze dient auch nur zu Testzwecken, wie ich von C# nach C++ Daten rüberschaufle.

Du meinst also, dass folgender Code einfach so funktionieren müßte.

                List<MyClassOrStruct> pointList = new List<MyClassOrStruct>();
                ClrWrapper.CppWrapper cppWrapper = new ClrWrapper.CppWrapper(pointList);

Das mit dem unsafe und den Zeigern habe ich aus dem Openbook Kapitel 10.10 so rausgelesen. Wenn ich das nicht brauche, dann ist das natürlich umso besser!
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Ja, irgendwie so müsste das gehen. Ich hab selber schon ewig nicht mehr mit C++/CLI gearbeitet und die Syntax fand ich schon immer sehr komisch. Auf der anderen Seite wäre das sowas wie List<MyClassOrStruct^>^, musst dich da etwas einlesen.
private Nachricht | Beiträge des Benutzers
Caveman
myCSharp.de - Member

Avatar #avatar-3854.jpg


Dabei seit:
Beiträge: 140

Themenstarter:

beantworten | zitieren | melden

Ja, werde ich machen bzw. bin gerade dabei. ECMA-372

Am Ende müssen die Daten aber in native C++ ankommen!
private Nachricht | Beiträge des Benutzers
Coder007
myCSharp.de - Member



Dabei seit:
Beiträge: 1249

beantworten | zitieren | melden

Ich würd jetzt nicht unbedingt in die Sprachspezifikation schauen... Ich würd sagen, das ist nichts, was du auf Dauer benötigen wirst und exakt verstehen musst. Ein gutes übersichtliches Tutorial zu finden dürfte reichen.
private Nachricht | Beiträge des Benutzers