Tjena! Du kan göra detta med remoting... Men handlar inte Remoting om att komma åt processer som t ex ligger å annan maskin eller liknande. Alltså du öppnar upp så du kan kalla på din service från lokal dator. Servicen är ju typ rätt isolerad från övriga program man bygger, för att kunna styra den förutom med start stop m.m. så kan du med remoting be den köra de metoder du vill köra. Det stämmer bra på det hela taget, och det ÄR remoting som jag ska fixa det med alltså. Jag får väl ge mig på det med andra ord. Jag skrev ett exempel på just detta för ett tag sedan och la upp på min website, kolla på http://www.netologi.se/default.aspx?Contents=RemotingWrapper. Jag har skapat en klass som kan sköter själva remoting kommunikationen, så du inte behöver lusa ner din kod med sådant... Det ser jäkligt fint ut måste jag säga.En klurig sak om att komma åt processer
Nu var det dags för en riktig "svåring". I alla fall för mig.
Följande sak föreligger:
Jag har en Windows Service som ligger å tickar men nu vill jag låta en annan process komma åt servicen och utföra handlingar i den, utan att stoppa servicen och utan att använda "ExecuteCommand" eftersom den inte kan felrapportera.
I API-världen eller om man så vill C så kan man bygga upp NamedPipes eller arbeta med shared mem och det närmsta jag kommit är följande:
<code>
Dim p() As Process = New Process().GetProcessesByName("msimn")
If p(0).ToString <> "" Then
Dim handle As IntPtr = p(0).Handle
End If
'' Här har jag en referens till processen msimn (Outlook Express)
Dim f As New FileStream(handle, FileAccess.Read)
</code>
Vad jag vill kunna göra är det som jag tror kommer efter. Jag skulle t ex vilja anropa en funktion eller liknande i Servicen så att jag kan stoppa vissa "processer" och resurser som den håller på ett snyggt sätt med felrapportering.
Jag har också tittat på Marshal och Reflection men kan inte riktigt se om de kommer lösa mitt problem.
Behöver du som vill lösa problemet mer uppgifter ger jag dig det hemskt gärna.
//Mikael SandSv: En klurig sak om att komma åt processer
Kolla på Remoting i SDKn för .Net för mer info.
Mvh JohanSv: En klurig sak om att komma åt processer
Jag behöver bara komma åt saker som ligger på samma burk och domän och rubbet.
Här är ett annat exempel på kod som jag kommit en bit med, dock får jag ett fel:
<code>
Dim p As New myRunningClass
Dim t As Type = port.GetType()
Dim progID As String = _ System.Runtime.InteropServices.Marshal.GenerateProgIdForType(t)
Dim o As Object = System.Runtime.InteropServices.Marshal.GetActiveObject(progID)
port = o
</code>
Felet inträffar på näst sista raden:
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Objektklassen kan inte bestämmas
//Mikael SandSv: En klurig sak om att komma åt processer
För jag antar att du vill komma åt metoder i den som om det vore en vanlig klass?
Mvh JohanSv: En klurig sak om att komma åt processer
Jag hade funderingar igår på shared events där jag hade en lite "router-komponent" som fixade kommunikation mellan ett program och ett annat. Problemet med den var att det inte gick att få de olika programmen att lyssna på samma event och, antar jag, samma instans av klassen...
//Mikael Sand
Ska nu behärska remotingSv: En klurig sak om att komma åt processer
Du måste se till att raden "Application.Run(new InfoSenderReceiver());" körs i Starter.cs (och bortkommentera den andra App.Run...), sedan ska det funka. Starta två instanser av programmet, starta receiver på en instans och skicka sedan info till det från den andra instansen.
/MattiasSv: En klurig sak om att komma åt processer
Jag löste remoteing med god hjälp av MSDN och min egen hjärna i fredags. Jag fick en dll som dessutom låg på en annan dator att exekvera under både TCP och HTTP. Jag måste säga att jag kände mig jäkligt stolt :-) även om jag för uppdragets skulle inte behöver ha min dll på en annan server.
Nästa steg, och nu måste jag säga tt jag inte läst din kod ännu, är att se om jag inte kan få events att fungera.
Tanken är lite att låta en client trigga ett event i min service (på servern) och låta servicen ta hand om detta event och i sin tur "rejsa" ett nytt event som klienten kan ta hand om. Är det egentligen rätt väg att gå eller ska jag fixa en callback hos klienten eller bara göra det hela asyncront? Klienten kan inte göra så mycket annat än å vänta i alla fall. I slutänden skulle det förhoppningsvis se ut ungefär som:
<code>
if myRemotService.RequestResourceShutDown("binaryreader")
myRemoteService.ShutDownResource("binaryreader")
else
return "Handlingen kunde inte utföras, försök senare"
end if
</code>
--EDIT--
Jag debuggade igenom koden som du skrivit Mattias och min förstfödda ska heta Mattias, vilket är bra för då tror alla att han är döpt efter min bror :-)
TACK!
Om någon vill ge mig fler tips angående arkitekturen kring remoting så får ni gärna det men nu markerar jag tården som löst.
--EDIT
//Mikael Sand