Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πως είναι ο σωστός τρόπος για να ελευθερώσω ενα Com Object?

Îåêßíçóå áðü ôï ìÝëïò plavidas. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 25-04-2005, 13:05. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-04-2005, 10:47 1673

    No [N] Πως είναι ο σωστός τρόπος για να ελευθερώσω ενα Com Object?

    Λοιπόν, μετά απο πολύ καιρό αποφάσισα να ρωτήσω και εγω κάτι στο forum.

    ίσως η ερώτησή μου να είναι κουτή, αλλά πάντα υπάρχει ένας καλός σαμαρίτης να βοηθήσει και τους αρχάριους στο αντικείμενο....

    Το πρόβλημά μου είναι οτι όταν δημιουργώ ένα COM (εγώ Είμαι ο Δημιουργός Big Smile)

    Dim
    _type As Type 
    _type = Type.GetTypeFromProgID("COMComponent", aIP)
    obj = Activator.CreateInstance(_type)
    If Not obj Is Nothing Then
      fResult = obj.Status(DataFromObj.Text)
    End If

    για να το τερματίσω πρέπει να τρέξω τον παρακάτω κώδικα:

    Dim CNT As Integer

    If
    Not obj Is Nothing Then
      Do
        CNT = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
      Loop While (CNT > 1)
      obj =
    Nothing
    End If

    If
    Not obj Is Nothing Then obj = Nothing

    και επιτέλους το ερώτημα που θέτω είναι :

    μπορώ τον παραπάνω κώδικα να τον αλλάξω χωρίς πρόβλημα και να κάνω απλά CType(obj, System.EnterpriseServices.ServicedComponent).Dispose()
    ή
    CType(obj, System.EnterpriseServices.ServicedComponent).DisposeObject()


    P.L. [8-|]


    Παναγιώτης Λαβίδας
    Software Developer
  •  22-04-2005, 20:45 1680 σε απάντηση της 1673

    Re: Πως είναι ο σωστός τρόπος για να ελευθερώσω ενα Com Object?

    Μπορείς να ρίξεις λίγο παραπάνω φως στην υπόθεση; Δηλαδή, τι object είναι αυτό ακριβώς; Έχεις ας πούμε μια κλάση από VB6 και θέλεις να την δημιουργήσεις στην μνήμη και να την χρησιμοποιήσεις μέσα από VB.NET? Η κάτι διαφορετικό;

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  25-04-2005, 11:52 1706 σε απάντηση της 1673

    Re: Πως είναι ο σωστός τρόπος για να ελευθερώσω ενα Com Object?

    Φίλε Γιώργο ευχαριστώ για την ανταπόκριση. Ουσιαστικά έχω ένα COM+ Component από Delphi7 στο οποίο εχω κάποιες μεθόδους που θέλω να καλέσω απο ASP .Net. (παιρνω κάθε φορά ενα xml String με κάποιες τιμές και δημιουργώ κάποιο chart)

    Try
      Dim _type As Type = Type.GetTypeFromProgID("AlisseMonitor_Agent.AlisseMonitorAgent", aIP)
      obj = Activator.CreateInstance(_type)

      If
    Not obj Is Nothing Then
        fResult = obj.AlisseStatus(DataFromObj.Text)
      End If

      fWideString = DataFromObj.Text
      DataFromObj.Text = ""

      If
    fResult = -1 Then
        Return fWideString + " ERROR " + fResult.ToString
      End If

      Dim
    res As New System.IO.StringReader(fWideString)
      DataSet1.ReadXml(res)
      If MyData.Rows.Count = DataSetRows Then
        MyData.Rows(0).Delete()
      End If
    Finally
      Try
        Dim CNT As Integer
           If Not obj Is Nothing Then
             Do
               CNT = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
             Loop While (CNT > 1)
             obj =
    Nothing
           End If
       
    If Not obj Is Nothing Then obj = Nothing
      Catch ex As Exception
        'do Nothing...
      End
    Try
    End Try

    Αν αυτό Βοηθάει, παρατήρησα ότι κάνοντας Dispose το object (obj.Dispose)
    αύτό παρέμενε στον mts και συνεχώς έβλεπα να αυξανονται οι μετρητές...
    (δεν ειδα πουθενά τον GC να περνάει και να καθαρίζει τα σκουπίδια, μάλλον ξέρει να κρύβετε καλά Stick out tongue)

    Ίσως η μαγική λέξη να είναι απο όλους παράτα την Delphi και ξαναγράψε τα COM σε .Net, αλλα ρε παιδιά καταλάβετε και μένα, είναι πάρα πολλά για να τα ξαναγράψω απο την αρχη..Crying

    Πίνω για να ξεχνώ ( Beer )

    P.L.



    Παναγιώτης Λαβίδας
    Software Developer
  •  25-04-2005, 13:05 1707 σε απάντηση της 1706

    Re: Πως είναι ο σωστός τρόπος για να ελευθερώσω ενα Com Object?

    Μου φαίνεται ότι έπρεπε να έχεις έρθει στην εκδήλωση που έγινε την περασμένη Παρασκευή! Άμα κοιτάξεις το forum θα βρεις περισσότερες πληροφορίες Smile Υπήρξε πολύ συζήτηση για Interoperability μεταξύ .COM και .NET.

    Κατ'αρχήν το component σου πρέπει να είναι ήδη μέσα στα component services και έτοιμο για δουλειά. :-) Αν δεν δουλεύει ήδη μέσω μια άλλης εφαρμογής! Smile

    Το πρώτο που πρέπει να κάνεις είναι να κάνεις reference το component σου σαν COM component μέσα στο project .ASP .NET (References/COM)

    Με το που θα το κάνεις αυτό θα δημιουργηθεί μέσα στο bin directory του project ένα αρχείο με το όνομα Interop.<Ονομα του dll σου>.dll

    Από εκεί και πέρα θα μπορείς να δημιουργείς και να χειρίζεσαι το αντικείμενο σου όπως κάθε άλλο .ΝΕΤ αντικείμενο.


    Dim objRef as AlisseMonitor_Agent.AlisseMonitorAgent

    objRef = new AlisseMonitor_Agent.AlisseMonitorAgent
    fResult = objRef.AlisseStatusClass(DataFromObj.Text)

    ....


    και όταν τελειώσεις μαζί του να το καταστρέψεις.

    objRef=Nothing

    Δεν είναι ανάγκη να γράψεις τίποτα άλλο. Ολα αναλαμβάνει να τα κάνει το Interop Assembly - τις αλλαγές των τύπων των μεταβλητών, το πέρασμα των λαθών από το .COM στο .NET την δημιουργία και την καταστροφή του COM αντικειμένου.

    Μπορείς να χρεισιμοποιήσεις Try/Catch για να κανεις handle των σφαλμάτων που μπορεί να σου επιστρέψει.

    Επειδή τα πράγματα είναι ακριβώς όπως τα λες, δεν γίνεται να τα ξαναγράψεις όλα από την αρχή, και δεν πετιέται δουλειά χρόνων μόνο επειδή θέλεις να κάνεις μια μετάβαση.

    Για οτιδήποτε άλλο, εδώ είμαστε!

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems