Laden...

Jt Open Toolkit mit C# nutzen

Erstellt von Caveman vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.641 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren
Jt Open Toolkit mit C# nutzen

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.

T
2.219 Beiträge seit 2008
vor 7 Jahren

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

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.

309 Beiträge seit 2008
vor 7 Jahren

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));}}

C
1.214 Beiträge seit 2006
vor 7 Jahren

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.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

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?

C
1.214 Beiträge seit 2006
vor 7 Jahren

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.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

Also mein Wrapper ist eine C++/CLR Klassenbibliothek. Das dürfte dann Deiner zweiten Möglichkeit entsprechen.

C
1.214 Beiträge seit 2006
vor 7 Jahren

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.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

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!

C
1.214 Beiträge seit 2006
vor 7 Jahren

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.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 7 Jahren

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

Am Ende müssen die Daten aber in native C++ ankommen!

C
1.214 Beiträge seit 2006
vor 7 Jahren

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.