sonyxp Δημοσ. 6 Μαρτίου 2014 Δημοσ. 6 Μαρτίου 2014 Καλησπέρα, Έστω ότι έχω μια κλάση MyGameObject η οποία έχει κάποια πολύ βασικά στοιχεία της κλάσης GameObject. Πως μπορώ να περάσω ένα αντικείμενο MyGameObject που είναι φτιαγμένο στην C# στην C++ ? ΥΓ: Δεν ρωτάω πως μπορώ να εκτελέσω κώδικα C++ σε C#, ρωτάω πως μπορώ να περάσω στις συναρτήσεις που έχω φτιάξει στην C++ σύνθετους τύπους δεδομένων. Ένας τρόπος φυσικά είναι να δουλέψω με απλούς τύπους δεδομένων αλλά αυτό είναι ένα βήμα πριν την ανακάλυψη του τροχού. (πολύ χρονοβόρο και "χαζό")
bnvdarklord Δημοσ. 6 Μαρτίου 2014 Δημοσ. 6 Μαρτίου 2014 Δεν καταλαβα, θες να μετατρέψεις κώδικα απο C# σε C++;
lion2486 Δημοσ. 6 Μαρτίου 2014 Δημοσ. 6 Μαρτίου 2014 enum Ζώδιο{ Ζώδιο1, Ζώδιο2, ΖώδιοΝ }; typedef struct{ int χρόνια; int μέρες; int ώρες; }ηλικία; Class Σύνθετος_Τύπος_Ανθρώπου{ public: STD::String όνομα; Ζώδιο το_Ζώδιο; ηλικία η_ηλικία; char * ταυτότητα; void * binary; }; κάτι τέτοιο θα το έλεγες σύνθετο;
sonyxp Δημοσ. 6 Μαρτίου 2014 Μέλος Δημοσ. 6 Μαρτίου 2014 Ναι... κάτι ακόμα πιο απλό... Πολύ μπακαλίστικα θέλω κάτι τέτοιο (ο κώδικας δεν έχει κάποια λογική, είναι απλά για να καταλάβετε τι θέλω να κάνω) // -------------------------- C# - Unity 3D --------------------------- using UnityEngine; using System.Collections; public class MyObject { { public Vector3 objPos; public String objName, objTag; public MyObject() { objPos = transform.position; objName = transform.name; objTag = transform.tag; } public myObject(Vector3 pos, String name, String tag) { objPos = pos; objName = name; objTag = tag; } } // Class 2 using UnityEngine; using System.Collections; public class Test : MonoBehaviour { // Load DLL [DllImport("MyDLL.dll", EntryPoint = "TestFunction")] public static extern MyObject TestFunction(MyObject obj); // The Object we need to pass to C++ MyObject player = new MyObject(transfrom.position, "Annie", "TAGPlayer"); void Start() { // Pass player object to C++, do what is to do and then get back the edited version of player object player = TestFunction(player); } } // -------------------------- C++ --------------------------- // How do i receive MyObject and work with it?
defacer Δημοσ. 6 Μαρτίου 2014 Δημοσ. 6 Μαρτίου 2014 Οι επιλογές σου είναι βασικά δύο: Αν μιλάμε για διαφορετικά processes, ανοίγεις ένα custom κανάλι επικοινωνιών ανάμεσά τους (π.χ. shared memory) και τελείως manually κάνεις ό,τι σου αρέσει. Αν μιλάμε για managed process από το οποίο θα κάνεις PInvoke unmanaged κώδικα, οι επιλογές σου σχετικά με το τι μπορείς να περάσεις είναι αυτές, συν πίνακες και structs των προηγουμένων. Αν αυτό δε σε καλύπτει τότε θα πρέπει να γράψεις custom marshaller, που είναι τελείως manual οπότε βασικά μπορείς εξίσου καλά αντί να δουλέψεις μ' αυτή τη λογική να κάνεις serialization π.χ. σε string και να χρησιμοποιήσεις τον default marshaller. 2
sonyxp Δημοσ. 6 Μαρτίου 2014 Μέλος Δημοσ. 6 Μαρτίου 2014 1. Δεν μιλάμε για διαφορετικά processes 2. Αυτό που λες για "custom marshaller" δεν μπορώ να το καταλάβω γιατί δεν το έχω δει ποτέ Όσον αφορά αυτό Αν μιλάμε για managed process από το οποίο θα κάνεις PInvoke unmanaged κώδικα, οι επιλογές σου σχετικά με το τι μπορείς να περάσεις είναι αυτές,... Είδα το λινκ, οπότε δεν υπάρχει τρόπος να περάσω ολόκληρο σύνθετο αντικείμενο ε; ... είχα μια ελπίδα ότι αν δημιουργούσα το αντικείμενο (την περιγραφή του) και στην άλλη μεριά θα το έπαιρνε... πρέπει να το δοκιμάσω...
παπι Δημοσ. 6 Μαρτίου 2014 Δημοσ. 6 Μαρτίου 2014 Μπορεις να φτιαξεις ενα wrapper σε mixed mode, και να μην μπεις στην διαδικασια του pinvoke. Anyway, γιατι μπλεκεις native με managed;
sonyxp Δημοσ. 7 Μαρτίου 2014 Μέλος Δημοσ. 7 Μαρτίου 2014 Το Unity3D χρησιμοποιεί C# και C/C++/ASM μέσω dll, σκεφτόμουν να έγραφα μεγάλο κομμάτι ενός test-project στην C++ έτσι για να δω πως είναι.
defacer Δημοσ. 7 Μαρτίου 2014 Δημοσ. 7 Μαρτίου 2014 Είδα το λινκ, οπότε δεν υπάρχει τρόπος να περάσω ολόκληρο σύνθετο αντικείμενο ε; ... είχα μια ελπίδα ότι αν δημιουργούσα το αντικείμενο (την περιγραφή του) και στην άλλη μεριά θα το έπαιρνε... Μπορείς (μάλλον, δε σε πιάνω 100%). Το θέμα είναι πως για οτιδήποτε δεν είναι POD πρέπει να τα κάνεις όλα custom.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα