Entwickler-Ecke
Sonstiges (.NET) - Von einer Klasse auf eine ander Klasse zugreifen
ebber - So 02.11.08 21:06
Titel: Von einer Klasse auf eine ander Klasse zugreifen
Hallo,
mein Problem ist ein wenig kompliziert zu beschreiben. Ich kann es schlecht lösen da ich irgendwie nicht so genau verstehe wie was wo... Ich beschreibe es mal:
Ich habe hier einen Programm, dass als WCF Server fungiert. Das ganze wird so gestartet:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| host = new ServiceHost(typeof(ebbService));
NetTcpBinding tcpBinding = new NetTcpBinding(); tcpBinding.TransactionFlow = false; tcpBinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign; tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows; tcpBinding.Security.Mode = SecurityMode.None;
host.AddServiceEndpoint(typeof(IebbService), tcpBinding, serviceUrl); host.Open(); |
Das oben ist in meinem normalen Window in einem Button Click Event.
Dann gibt es 2 auto generiete Dateien von VS (an die ich meine Sachen angefügt habe)
IebbServices.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| namespace eBM { [ServiceContract] public interface IebbService { [OperationContract] string DoWork(string text); }
} |
und ebbService.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| namespace eBM { public class ebbService : IebbService { public string DoWork(string text) { return "e ist " + text; }
} } |
Also das funktioniert jetzt so, dass ich mit einem anderen Programm connecte und dann DoWork eben ausführe und dann das return bekomme. Ich möchte jetzt aber wenn DoWork ausgeführt wird eine Funktion in meinem Hauptfenster vom Anfang ausführen.
Ich habe aber leider keine Ahnung wie ich zu dem komme?
Ich hoffe die Informationen reichen sonst würde ich einfach mal das ganze Projekt anhängen wenns sich jemand anschauen würde.
MfG
Kha - So 02.11.08 23:10
Ohne einen wirklichen Überblick über WCF zu haben: Es gibt doch eine Überladung des ServiceHost-Konstruktors, die kein Type sondern ein Objekt entgegennimmt. Der kannst du also eine Instanz deiner Service-Klasse andrehen, in die du eine Referenz auf deine Form gepackt hast (ein Event wäre natürlich schöner).
ebber - So 02.11.08 23:46
Also ich vermute mal du hast sowas gemeint:
C#-Quelltext
1: 2: 3: 4:
| ebbService ebbS = new ebbService(this);
host = new ServiceHost(ebbS); |
Funktioniert leider nicht. Bringt Folgende Fehlermeldung(ich weis nicht ob jemand was damit Anfangen kann/will):
Quelltext
1: 2:
| exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll The communication object is not in a Opened or Opening state and cannot be modified. |
Ein Event ginge nur wenn das Andere auch ginge?
MfG
Th69 - Mo 03.11.08 12:42
Du könntest ein statisches Event definieren (da du ja direkt kein Objekt der Klasse IebbService erzeugst) und dich dann daran hängen und dieses dann in DoWork aufrufen.
ebber - Mo 03.11.08 17:49
Hört sich gut an :)
Ich habe aber leider keine Ahnung wie das auch nur ungefähr gehen könnte :(
Könntest du mir dazu ein paar Zeilen Code geben, bitte.
MfG
Kha - Mo 03.11.08 17:57
ebber hat folgendes geschrieben : |
C#-Quelltext 1: 2: 3: 4:
| ebbService ebbS = new ebbService(this);
host = new ServiceHost(ebbS); | |
Vielleicht bin ich gerade irgendwie neben der Spur, aber ich sehe weder von deiner Service-Klasse noch von ServiceHost einen Konstruktor mit einem Parameter :gruebel: ?
Th69 - Mo 03.11.08 18:08
Wie man ein Ereignis definiert und aufruft, sollte eigentlich in jedem Anfängerbuch stehen, u.a. auch hier
http://openbook.galileocomputing.de/visual_csharp/ Kapitel 4.5.
Und "statisch" bedeutet, daß du einfach "static" dazu schreibst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| public ebbService { public static event EventHandler DoWorkEvent; public string DoWork(string text) { if(DoWorkEvent != null) DoWorkEvent(this, EventArgs.Empty); return "e ist " + text; } }
ebbService.DoWorkEvent += myDoWork;
void myDoWork(object sender, EventArgs e) { } |
ebber - Mo 03.11.08 20:02
@Kha: Vielleicht bin ich gerade neben der Spur, aber das this hier
ist der Parameter?
Und dann:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| Window1 wind;
public ebbService(Window1 win) { wind = win; } |
@Th69
Danke, funktioniert einwandfrei.
MfG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!