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.
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ß
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Hallo Pria,
was willst du eigentlich erreichen? Was ist das eigentlichen Ziel?
herbivore
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?
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!
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?