Laden...

Methoden aus anderem Prozess heraus binden

Erstellt von userid11997 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.391 Views
U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren
Methoden aus anderem Prozess heraus binden

Moin,

ich würd gern wissen , ob es möglih ist , Methoden per Reflection aus einem anderen laufenden .NET Prozess heraus zu binden. Also quasi so: ich habe ein Programm XY welches über eine Methode Z verfügt. Nun starte ich das Programm und möchte nun ein anderes Programm starten , welches die Methode Z des laufenden Prozesses von XY bindet und beispielsweise auf 'Blau' setzt.

B
387 Beiträge seit 2005
vor 13 Jahren

Hi,

ganz so leicht geht das nicht. Was du willst, ist Kommunikation zwischen verschiedenen Prozessen, oder?

Das einfachste dafür ist WCF (kann man sich ja auch noch am ehesten so vorstellen, wie du es beschreibst). Dann gibts da noch so Sachen wie Remoting, WM_COPY_DATA, etc... Einfach suchen

Gruß

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Pria,

mithilfe von Code Injection ist es möglich. Such mal nach Crack.NET, WPF Insptector oder Mole. Vielleicht kannst du dadruch schlauer werden.

zero_x

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Pria,

was willst du eigentlich erreichen? Was ist das eigentlichen Ziel?

herbivore

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren

mithilfe von Code Injection ist es möglich. Such mal nach Crack.NET, WPF Insptector oder Mole. Vielleicht kannst du dadruch schlauer werden.

CodeInjection habe ich mir schon angesehen , ich weiß allerdings nicht , wie ich da auf die instanzen von den vorhandenen objekten komme um sinnvoll die methoden zu linken.

Bei Spy.NET gabs leider keinen Quellcode um zu sehen , wie er das gemacht hat.
Was ich mir grad auchnoch angesehen habe war Spy++ und AOP.

Mir ist aber immernochnicht ganz klar , wie ich die methoden eines bestehenden objektes der klasse xyz per Reflection linke , sodass ich im Prozess darauf zugreifen und sie verwenden kann.

Ich muss auf jeden Fall eine Bibliothek injezieren , um auf das laufende Assembly zugreifen zu können richtig?

3.728 Beiträge seit 2005
vor 13 Jahren
Proxy erstellen

Hallo Pria,

das ist gar nicht so schwer wie Du denkst. Du kannst das mit einem benutzerdefinierten Proxy machen. Dazu musst Du eine Proxy-Klasse schreiben, welche von RealProxy (hier ist auch ein Beispiel zu finden) abgeleitet wird.
Du musst dann nur die Invoke-Methode überschreiben.

Der Proxy wird nach der Erzeugung Transparent gemacht. Der Transparente Proxy kann in die gewünschte Schnittstelle gecastet werden.
Idealerweise baust Du Dir noch eine ProxyFactory<T>, die sich um die Proxyerstellung und die Rückgabe des Proxys in der richtigen Schnittstelle kümmert.

Wenn Du dann Methode X von Schnittstelle Y an Proxy Z aufrufst, dann wird eine Message erzeugt, welche Methodenname und Parameter enthält. Diese Message wird an die Invoke-Methode des Proxys übergeben.

So lässt sich eine Art AOP mit .NET Bordmitteln bauen. Bedenke allerdings, dass der eingezogene Proxy auch Auswirkungen auf die Performance hat. Die Proxy-Geschichte kommt .NET Remoting (WCF verwendet aber das selbe Verfahren, um seine Proxies zu erzeugen - deshalb wird uns .NET Remoting auch erhalten bleiben 😄) und ist ist nicht dafür entworfen worden, um Call-Interception für fingranulare komplexe Objektmodelle zu ermöglichen, sondern eher für entfernte Dienstklassen.

Richtig eingesetzt, sind Proxies aber ein mächtiges Werkzeug!

U
userid11997 Themenstarter:in
400 Beiträge seit 2008
vor 13 Jahren

Vielen Dank für eure Beiträge 😁

bezogen auf deinen Beitrag:

[PermissionSet(SecurityAction.LinkDemand)]
   public MyProxy(Type myType) : base(myType)
   {
      // RealProxy uses the Type to generate a transparent proxy.
      myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType));
      // Get 'ObjRef', for transmission serialization between application domains.
      ObjRef myObjRef = RemotingServices.Marshal(myMarshalByRefObject);
      // Get the 'URI' property of 'ObjRef' and store it.
      myURIString = myObjRef.URI;
      Console.WriteLine("URI :{0}", myObjRef.URI);
   }

Ich vermute jetzt mal , dass ich diesen Code in den Prozess einschleusen muss richtig?
Dann müsste ich die Zeile myMarshalByRefObject = (MarshalByRefObject)Activator.CreateInstance((myType)); eben durch myMarshalByRefObject = (MarshalByRefObject)Process.CallingAssembly (in etwa so) ersetzen , um dann auf den Prozess zu zeigen?

Das habe ich hier im Forum gefunden , was ebenfalls noch interessant ist , ist das hier

Das Beispiel im letzten Link arbeitet mit dem aspect Bezeichner.

Was ist denn nun Besser? Mit was habe ich die Besten möglichkeiten?
Kann ich mit dem Proxy auch auf die aktuellen Werte und vor allem auf die aktuellen Instanzen im Speicherbereich des Prozesses zugreifen?