Hallo,
ich programmiere eine Schnittstelle welche Daten von Rhino nach RStab8 exportieren und die Ergebnisse wieder in Rhino darstellen soll. Vor ein paar Tagen hatte ich das Problem, dass beim Erstellen der Auflager entweder Rhino oder RStab abgestürzt sind, es wurde auch eine Exception geworfen (AccessViolationException).Dann habe ich rausgefunden, dass diese entstehen kann wenn bspw. von 64bit auf 32bit Variablen gewechselt wird ohne vorher zu konvertieren, denn dann wird im nicht verwalteten oder geschützten Speicher gelesen, was auch in der Zusatzinfo der Exception steht.
Also habe ich einfach mal die 64bit-Assembly von RStab referenziert und es klappt alles. Außer das jetzt meine IDE rummeckert, ich solle doch mal die Prozessorarchitektur anpassen, nur wenn ich die ändere von Any-CPU auf 64bit, erkennt Rhino bzw. das Grasshopper-Plugin von Rhino, meine Komponenten nicht mehr. Daher sieht es im Moment bei mir so aus, dass ich das eigentliche Programm und die eigens erstellte RStab-Assembly mit Any-CPU ausführe, aber eine 64-bit Assembly von RStab einbinde und die Warnung vom Compiler mehr oder weniger ignorier.
Mir ist jetzt aufgefallen, dass in den RStab Funktionen mit Marshal und InteropServices gearbeitet wird, also muss ja von RStab aus irgendwo intern auf sogenannten "unmanaged Code" zugegriffen werden. Und die Funktion zum Auflager erstellen (IData.rsSetNodeSupport(nodesupp); ) erwartet auch für die Klasse "RS_NODE_SUPPORT" einen "String" für die Auflagerliste. Dieser ist nach MSDN
(https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx) ein "Non-Blittable-Type". Das heißt der macht Probleme, wenn er an Funktionen übergeben wird, die mit unmanaged-Code arbeiten.
Daher ist meine Vermutung, dass genau hier noch auf vielleicht C++/CLI Code zurückgegriffen wird. Aber ich hab keine Ahnung wie ich damit umgehen soll.
Parallel habe ich mir ein Windows-Formsblatt erstellt um die eigene RStab-Assembly schneller testen zu können. Hier bekomme ich keine Probleme und das Erstellen von Auflagern hat von Anfang an funktioniert. Jetzt habe ich gerade gesehen, dass hier die Standard Prozessor-Architektur x86 ist, also 32bit?
Im Moment funktioniert alles ich hab schon RStab von Rhino aus rechnen lassen und mir die ersten verformten Knoten von Rhino neu zeichnen lassen. Aber ich weiß nicht wie lange das noch gut geht und würde einerseits gerne die Warnmeldung vom Compiler loswerden und andererseits verstehen was hier passiert.
Sollte ich dann vielleicht die MSIL-Assembly von RStab einfügen, meine Assembly mit einer x86 Architektur ausführen und in der Grasshopper Anwendung dem Compiler mitteilen das hier irgendwas mit einer x86-Architektur ankommt?
ich programmiere eine Schnittstelle welche Daten von Rhino nach RStab8 exportieren und die Ergebnisse wieder in Rhino darstellen soll. Vor ein paar Tagen hatte ich das Problem, dass beim Erstellen der Auflager entweder Rhino oder RStab abgestürzt sind, es wurde auch eine Exception geworfen (AccessViolationException).Dann habe ich rausgefunden, dass diese entstehen kann wenn bspw. von 64bit auf 32bit Variablen gewechselt wird ohne vorher zu konvertieren, denn dann wird im nicht verwalteten oder geschützten Speicher gelesen, was auch in der Zusatzinfo der Exception steht.
Also habe ich einfach mal die 64bit-Assembly von RStab referenziert und es klappt alles. Außer das jetzt meine IDE rummeckert, ich solle doch mal die Prozessorarchitektur anpassen, nur wenn ich die ändere von Any-CPU auf 64bit, erkennt Rhino bzw. das Grasshopper-Plugin von Rhino, meine Komponenten nicht mehr. Daher sieht es im Moment bei mir so aus, dass ich das eigentliche Programm und die eigens erstellte RStab-Assembly mit Any-CPU ausführe, aber eine 64-bit Assembly von RStab einbinde und die Warnung vom Compiler mehr oder weniger ignorier.
Mir ist jetzt aufgefallen, dass in den RStab Funktionen mit Marshal und InteropServices gearbeitet wird, also muss ja von RStab aus irgendwo intern auf sogenannten "unmanaged Code" zugegriffen werden. Und die Funktion zum Auflager erstellen (IData.rsSetNodeSupport(nodesupp); ) erwartet auch für die Klasse "RS_NODE_SUPPORT" einen "String" für die Auflagerliste. Dieser ist nach MSDN
(https://msdn.microsoft.com/en-us/lib...vs.110%29.aspx) ein "Non-Blittable-Type". Das heißt der macht Probleme, wenn er an Funktionen übergeben wird, die mit unmanaged-Code arbeiten.
Daher ist meine Vermutung, dass genau hier noch auf vielleicht C++/CLI Code zurückgegriffen wird. Aber ich hab keine Ahnung wie ich damit umgehen soll.
Parallel habe ich mir ein Windows-Formsblatt erstellt um die eigene RStab-Assembly schneller testen zu können. Hier bekomme ich keine Probleme und das Erstellen von Auflagern hat von Anfang an funktioniert. Jetzt habe ich gerade gesehen, dass hier die Standard Prozessor-Architektur x86 ist, also 32bit?
Im Moment funktioniert alles ich hab schon RStab von Rhino aus rechnen lassen und mir die ersten verformten Knoten von Rhino neu zeichnen lassen. Aber ich weiß nicht wie lange das noch gut geht und würde einerseits gerne die Warnmeldung vom Compiler loswerden und andererseits verstehen was hier passiert.
Sollte ich dann vielleicht die MSIL-Assembly von RStab einfügen, meine Assembly mit einer x86 Architektur ausführen und in der Grasshopper Anwendung dem Compiler mitteilen das hier irgendwas mit einer x86-Architektur ankommt?
Kommentar