Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.NET] IPC, Remoting / Shared Assembly

Pagina: 1
Acties:

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Graag wil ik vanuit een kleine executable (vanaf nu "A") -die opgestart wordt vanuit een webserver via PHP- (maar dat maakt op dit moment even niets uit, puur als achtergrond informatie) een bericht of commando sturen naar een ander programma (Windows form, vanaf nu "B") om daar bijvoorbeeld een procedure te starten of gewoon een "buttonclick" te initiëren die vervolgens die procedure opstart.

Ik heb het al helemaal werkend:
Als ik zélf A opstart vanuit de verkenner, dan zoekt A de handle van B, en vervolgens de handle van de button op B, en doet dan een buttonclick. Alles good so far 8)

Nu komt het: wanneer ik A laat runnen vanuit PHP (een andere user/omgeving dan waar B in draait realiseerde ik me gisteren) dan vind A niet eens de handle(s) van B.

Dus moet ik een andere weg in slaan om dit (communicatie tussen 2 programmaatjes) werkend te kijken. Ik heb wat gelezen over IPC, remoting en shared assembly. Ook heb ik een voorbeeld gevonden waarvan ik dacht dat het wel ging werken, maar helaas krijg ik het niet aan de gang:

http://anoriginalidea.wor...s-communication-in-vbnet/
(de link naar de zipfile in het artikel werkt helaas niet meer!)

Ook kan ik verder nergens een goed, werkend voorbeeld vinden voor VB.NET
Ik heb deze materie in het verleden ook al eens proberen op te pakken, maar toen lukt het ook al niet. Het wordt tijd voor wat hulp dus :) Zou echt super handig zijn (voor 1001 toepassingen) om dit eens werkend te krijgen _/-\o_

Wie helpt me op weg? O+

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom kijk je niet naar een simpelere oplossing? Zoals het aanbieden van een Service via WCF of de WebApi.

Via WCF kun je er dan ook voor kiezen over welk communicatie medium dat gaat. Nog eenvoudiger is gewoon een self hosted WebApi te gebruiken. Of eventueel gewoon zelf met een HttpListener, maar daar zul je zelf meer code voor moeten schrijven, dus zou ik niet snel doen.

Het voordeel van een WebApi is dat je gewoon eenvoudig vanuit PHP de url aan kunt roepen, en dus geen tweede programma nodig hebt.

WCF ( MSDN: How to: Host a WCF Service in a Managed Application )
WebApi (http://www.asp.net/web-ap...b-api/self-host-a-web-api)
HttpListener (MSDN: HttpListener Class (System.Net))

[ Voor 52% gewijzigd door Woy op 18-02-2014 10:38 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
Thanks voor de reply Woy.
Dat ziet er ook allemaal érg interessant uit.
Had ik maar de tijd om dit allemaal op m'n gemak door te lezen.
Zeker sjiek voor in de toekomst :)

Maar gaat dit niet allemaal "storen" met de al draaiende webserver? Ik zie toch wel vaak TCP en 8080 etc... voorbij komen in die artikelen wat je noemt! Bovendien vraag ik me af of dit dan écht de manier is om zoiets te doen?

Waarvoor wordt IPC dan gebruikt als het niet gebruikt zou worden voor mijn doeleinde? Je ziet het: ik weet er nog té weinig vanaf om precies te kunnen bepalen wanneer ik wat nodig heb, maar ik dacht goed bezig te zijn om in de richten van IPC te denken ;)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
atmoz schreef op dinsdag 18 februari 2014 @ 12:24:
Maar gaat dit niet allemaal "storen" met de al draaiende webserver? Ik zie toch wel vaak TCP en 8080 etc... voorbij komen in die artikelen wat je noemt! Bovendien vraag ik me af of dit dan écht de manier is om zoiets te doen?
Het hoeft niet te storen, maar je kunt inderdaad geen url/poort gebruiken die al door de webserver geclaimed is. Het makkelijkst is dus gewoon op een andere poort gaan zitten. Lees ook wel even het kopje "(Optional) Add an HTTP URL Namespace Reservation"

WCF zou je bijvoorbeeld ook prima via Named Pipes kunnen gebruiken.
Waarvoor wordt IPC dan gebruikt als het niet gebruikt zou worden voor mijn doeleinde? Je ziet het: ik weet er nog té weinig vanaf om precies te kunnen bepalen wanneer ik wat nodig heb, maar ik dacht goed bezig te zijn om in de richten van IPC te denken ;)
IPC is gewoon een generieke term voor communicatie tussen processen dat kan op verschillende manieren. Remoting kan namelijk ook over TCP/IP lopen. Jij doelt waarschijnlijk meer op (Named)Pipes, en dat is inderdaad goed bruikbaar voor onderlingen communicatie van processen, maar ik zou dat op dit moment niet meer met Remoting doen, maar met WCF. Remoting wordt nog wel ondersteund voor legacy, maar het is niet meer aan te raden om nieuwe oplossingen daar in te ontwikkelen.

Maar zeker voor eenvoudige interfaces zou ik gewoon kiezen voor een simpele HTTP oplossing, aangezien dat ook lekker makkelijk aan te roepen is. Je kunt het zelfs testen in de browser.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 20-11 12:36

ZaZ

Tweakers abonnee

Als je quick en dirty wil kan je natuurlijk ook gewoon (named)pipes/mailslots/memmapped file+mutex of whatever gebruiken. Heb je geen remoting of WCF voor nodig natuurlijk.
Heb je in een paar regels code communicatie tussen meerdere processen

Lekker op de bank


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
Bedankt voor de opheldering!
Woy schreef op dinsdag 18 februari 2014 @ 14:16:
[...]

Maar zeker voor eenvoudige interfaces zou ik gewoon kiezen voor een simpele HTTP oplossing, aangezien dat ook lekker makkelijk aan te roepen is. Je kunt het zelfs testen in de browser.
Ik heb het nu draaien vanuit het voorbeeld wat je gaf met deze link:
MSDN: How to: Host a WCF Service in a Managed Application

Dat werkt goed :) Ook weer érg interessant spul allemaal 8)

Maar wat ik me afvraag: hoe kan ik dit nu testen vanuit de browser dan?
(en in het verlengde daarvan: straks met PHP aansturen?)

Ik heb: Dim baseAddress As Uri = New Uri("http://localhost:8080/hello") maar als ik die link volg kom ik op een pagina met:
HelloWorldService Service

You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:

svcutil.exe http://localhost:8080/hello?wsdl
You can also access the service description as a single file:

http://localhost:8080/hello?singleWsdl

This will generate a configuration file and a code file that contains the client class. Add the two files to your client application and use the generated client class to call the Service. For example:


Visual Basic

Class Test
Shared Sub Main()
Dim client As HelloWorldServiceClient = New HelloWorldServiceClient()
' Use the 'client' variable to call operations on the service.

' Always close the client.
client.Close()
End Sub
End Class
Welke link moet ik volgen om de procedure aan de service kant te runnen (en bijvoorbeeld een MsgBox te triggeren?)

[edit2]

Dat is volgens mij niet mogelijk he? Direct via de browser "triggeren"?
Zie; http://stackoverflow.com/...-method-through-a-browser

[edit1]

@ZaZ: kun je een simpel voorbeeld geven van zo'n Quick & Dirty oplossing? (eigenlijk puur uit interesse, het zal wel gaan werken met 't verhaal wat ik inmiddels al heb)

[ Voor 8% gewijzigd door Atmoz op 18-02-2014 15:45 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
atmoz schreef op dinsdag 18 februari 2014 @ 15:37:
Maar wat ik me afvraag: hoe kan ik dit nu testen vanuit de browser dan?
(en in het verlengde daarvan: straks met PHP aansturen?)
Aangezien je WCF gebruikt is het afhankelijk van je binding configuratie welk transport channel er gebruikt wordt. Waarschijnlijk gebruik je nu de basicHttpBinding of de wsHttpBinding, die gebruiken Http i.c.m. soap om te communiceren. Daarvoor zul je dus een soap-client moeten gebruiken om het vanuit PHP aan te sturen.

Als je het makkelijk vanuit de browser wil testen kun je beter kijken naar de andere link die ik gaf over de WebAPI. Dan kan je vanuit je browser gewoon simpele HTTP requests uitvoeren. In PHP kan dat dan bijvoorbeeld met Curl, al zullen er vast nog andere mogelijkheden zijn, maar ik ben niet heel bekend met PHP.
Ik heb: Dim baseAddress As Uri = New Uri("http://localhost:8080/hello") maar als ik die link volg kom ik op een pagina met:
[...]
Welke link moet ik volgen om de procedure aan de service kant te runnen (en bijvoorbeeld een MsgBox te triggeren?)
Nu gebruik je WCF, en waarschijnlijk heb je nu een binding die via SOAP communiceert, dus niet eenvoudig uit de browser.
@ZaZ: kun je een simpel voorbeeld geven van zo'n Quick & Dirty oplossing? (eigenlijk puur uit interesse, het zal wel gaan werken met 't verhaal wat ik inmiddels al heb)
Named Pipes kun je redelijk vergelijken met TCP/IP, het zijn beide streams van data. Het verschil is dat Named Pipes gewoon via het geheugen van de PC verlopen, en dus niet via de TCP/IP stack.

Voor een voorbeeldje kun je bijvoorbeeld hier kijken: http://stackoverflow.com/...53/example-of-named-pipes

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-11 15:12
ZaZ schreef op dinsdag 18 februari 2014 @ 15:28:
Als je quick en dirty wil kan je natuurlijk ook gewoon (named)pipes/mailslots/memmapped file+mutex of whatever gebruiken. Heb je geen remoting of WCF voor nodig natuurlijk.
Heb je in een paar regels code communicatie tussen meerdere processen
Waarom is dat quick en dirty eigenlijk? De TS heeft beide kanten in zijn beheer, dus dit lijk tme een heel valide oplossing.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 20-11 12:36

ZaZ

Tweakers abonnee

farlane schreef op dinsdag 18 februari 2014 @ 16:09:
[...]

Waarom is dat quick en dirty eigenlijk? De TS heeft beide kanten in zijn beheer, dus dit lijk tme een heel valide oplossing.
Klinkt alsof TS tegen de beperkingen aanloopt van zijn webbased oplossing en dus al 'quick en dirty' naar een exe heeft gegrepen om dingen te doen en die vanuit daar te spawnen.
Mijn gevoel zegt dat het ontwerp niet helemaal doordacht is, al kan ik daar natuurijk niets zinnigs over zeggen.

Ik opperde de optie named pipes zonder extra framework omdat, nogmaals, mijn gevoel zegt dat TS niet zit te wachten op een redesign van alles wat er tot nu toe staat en zo misschien wel tevreden is met een simpele hack.

Maar goed; Aannames

Lekker op de bank


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 21-11 14:23

Atmoz

Techno!!

Topicstarter
Bedankt voor de reacties allemaal!
Ik ben (op dit moment) inderdaad op zoek naar een snelle/makkelijke oplossing voor mijn "probleem".
Maar dat wilt niet zeggen dat ik de andere opties niet wil weten/leren. Ik ben al een STUK verder dan voordat ik dit topic begon. Heb 't nu ook werkend met MMF, behalve dat ik geen "handle" te pakken krijg bij het "ontvang-programma". Ik kan wel een timer maken wat steeds kijkt naar de MMF, maar dat vind ik niet zo netjes. Het "stuur-programma" werkt wel perfect. Wist helemaal niet dat je met VB.NET zulke mooie dingen kon maken :) Echt een leerzame dag dit!!

Is er nog een mogelijkheid om toch een "trigger" te krijgen bij het "ontvang-programma" ?

Het hele ontvang-programma is:
Imports System.IO
Imports System.IO.MemoryMappedFiles
Imports System.Threading

'http://www.codeproject.com/Articles/138290/Programming-Memory-Mapped-Files-with-the-NET-Frame

Public Class Form1

Dim buffer(100) As Byte

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

Dim mmf As MemoryMappedFiles.MemoryMappedFile = MemoryMappedFiles.MemoryMappedFile.OpenExisting("testmap")
Dim accesor = mmf.CreateViewAccessor(0, 100)

Dim Mutex As Mutex = Mutex.OpenExisting("testmapmutex")
Mutex.WaitOne()

accesor.ReadArray(0, buffer, 0, 99)
Dim de As String = System.Text.ASCIIEncoding.ASCII.GetString(buffer)
MsgBox(de)

End Sub

End Class
Hoe nu iets te maken dat hij wel steeds die MMF checkt, maar niet het hele programma vasthangt of gebruik van een timer? Is er voor die MMF niets te verzinnen wat een trigger geeft als er iets nieuw weggeschreven wordt in die MMF?

Als dit niet lukt ga ik inderdaad proberen met WebAPI, maar liever eerst ook dit even helemaal werkend krijgen. Echt fijne dingen dit voor toekomstige tooltjes :)

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 20-11 12:36

ZaZ

Tweakers abonnee

Gewoon pollen in een backgroundworker

Lekker op de bank

Pagina: 1