Announcement

Collapse
No announcement yet.

Activator.GetObject vs.
Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Activator.GetObject vs.
    Hallo!<p>

    Habe unter Delphi ein COM+-Objekt erzeugt (ActiveX-Form). Das kann ich unter ASP.NET auf dem lokal installierten Server auch wunderbar in einer aspx-Anwendung in einem <object>-container laufen lassen. Wie bringe ich aber nun der Web-Anwendung bei, daß dieses Object auch auf einem entferntet Server läuft? <p>
    Bin bei der Suche auf activator.getobject gestoßen, weiß aber nicht so richtig, wie ich das unter c# verwende, meine WQahl wäre schon das object-Tag, wenn der nur nicht das ocx runterladen wollte, das muß auf dem server laufen! Also bleibe ich wohl bei dem activator? Bloß wie erzeuge ich dann einen container, in dem das ocx läuft?<p>
    Vielen Dank schonmal für Eure Antworten, bin da leider Anfänger und habe keine große Ahnung. Deshalb bitte mit Codebeispielen, wie das einzubinden sein könnte.<p>
    Nils

  • #2
    Hallo,

    rein technisch gesehen gibt es da keinen Unterschied. Das primäre Ziel von .NET besteht darin, die Anzahl von Programmierschnittstellen zu verringern, die ein Entwickler kennen muss. Die <b>Activator</b>-Klasse aus dem Namespace <i>System</i> ist der einzige Weg unter .NET, um Objektinstanzen zu erzeugen. Es spielt dabei keine Rolle, ob die Activator-Klasse explizit aufgerufen wird oder hinter den Kulissen implizit beim Aufruf der Sprache-Funktionen wie <b>New</b> bzw. <b>new</b> ins Spiel gebracht wird. Die Activator-Klasse kann das Verhalten zur Laufzeit ändern, so dass die Instanzierung von lokalen und entfernten Objekten möglich wird. Generell gibt es 2 Instanzierungswege:<br>
    1. CreateInstance = neue Objektinstanz erzeugen<br>
    2. GetObject = Verbindung zu einem bereits bestehenden, über den Namen her bekannten Objekt herstellen

    Das folgende Beispiel demonstriert, wie ein C#-Programm ein mit Delphi erstelltes DCOM-Objekt über die IP-Adresse aufruft:
    <pre>
    using System.Runtime.InteropServices;
    using Delphi6DCOMSrv;
    ...
    private const string sDCOMObj = "Delphi6DCOMSrv.Delphi6DCOMSrvObj";

    private void button1_Click(object sender, System.EventArgs e)
    {
    Type aSrvType = Type.GetTypeFromProgID(sDCOMObj, textBoxIP.Text, false);
    Object aSrvObj = Activator.CreateInstance(aSrvType);
    // Neutrales Object gegen Verweis auf die DCOM-Serverklasse eintauschen
    Delphi6DCOMSrvObjClass aSrv = aSrvObj as Delphi6DCOMSrvObjClass;
    // DCOM-Server aufrufen
    string sSrvMsg;
    statusBar1.Text = aSrv.DoWork("Test", out sSrvMsg) + " - " + sSrvMsg;
    // DCOM-Server freigeben
    Marshal.ReleaseComObject(aSrvObj);
    aSrvObj = null;
    }
    </pre>

    &gt;... ActiveForm.....

    Ein mit Delphi erzeugtes ActiveForm verwendet ein Fenster, so dass dieses Teil nur dann verwendet werden kann, wenn das OCX-Modul auf den Client-Rechner heruntergeladen und dort <b>lokal</b> ausgeführt wird. Via DCOM sind nur nicht-visuelle Anwendungs-Objekte erreichbar, aber alles, wass USER- und GDI-Ressourcen benötigt, kann nur lokal laufen. Aus diesem Grund setzt ja ASP.NET (Web Forms) alle visuellen Elemente in reines HTML um, damit der Webbrowser diese Sachen anzeigen kann, ohne die Module herunterladen zu müssen.

    P.S: Da man in .NET einzelne Formulare aus dem Programm heraus direkt über eine URL aus dem Web laden und anzeigen lassen kann, gibt es unter .NET auch keinen Grund mehr für Konstrukte wie ActiveForms

    Comment

    • Working...
      X