Comunicazione interprocesso per Windows in C# (.NET 2.0)
Domanda
Non ho mai dovuto eseguire IPC su Windows prima.Attualmente sto sviluppando un paio di programmi, un'app GUI/CLI standard e un servizio Windows.L'app deve dire al servizio cosa fare.Quindi, presupponendo che la comunicazione sia solo locale, quale sarebbe il metodo di comunicazione migliore per questi due processi?
Dove migliore è definito come più robusto e meno soggetto a errori, non il più performante né il più facile da codificare.
Gli esempi di codice saranno molto graditi, ma non sono obbligatori :-)
Nota: sto chiedendo cosa utilizzare, un socket TCP standard, pipe denominate o solo altri mezzi di comunicazione.
Grazie!
Soluzione
L'IPC in .Net può essere ottenuto utilizzando:
WCF
utilizzando pipe denominate richiede .Net 3.0 e al di sopra.
Esempio di codice
- La classe WCF NetNamedPipeBinding può essere utilizzato per la comunicazione tra processi sulla stessa macchina.La documentazione MSDN per questa classe include un esempio di codice che copre questo scenario http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx
Remotazione
Il framework IPC originale rilasciato con .Net 1.0.Credo che la comunicazione remota non venga più sviluppata attivamente e sei invece incoraggiato a utilizzare WCF
Esempio di codice
Comunicazione tra processi tramite Remoting - utilizza un canale TCP
Risorse
- GenuineChannels vende un kit di strumenti remoti che include un canale di memoria condivisa. http://www.genuinechannels.com/Index.aspx
- Ingo Rammer, ha scritto il libro definitivo sulla comunicazione remota .Net, Servizi remoti .NET avanzati, seconda edizione
Win32 RPC utilizzando csharptest-net RpcLibrary
Recentemente mi sono imbattuto in un progetto che ha racchiuso la libreria RPC Win32 e creato una libreria di classi .net che può essere utilizzata per RPC locale e remoto
Home page del progetto: http://csharptest.net/projects/rpclibrary/
Riferimenti MSDN:
- Come funziona rpc: http://technet.microsoft.com/en-us/library/cc738291(v=ws.10).aspx
- Funzioni RPC: http://msdn.microsoft.com/en-us/library/aa378623(v=VS.85).aspx
Ha anche un client rpc buffer del protocollo Google che viene eseguito sulla libreria: https://code.google.com/p/protobuf-csharp-rpc/
WM_COPYDATA
Per completezza è anche possibile utilizzare il metodo WIN32 con il file WM_COPYDATA Messaggio.Ho già utilizzato questo metodo in .Net 1.1 per creare un'applicazione a istanza singola che apre più file da Windows Explorer.
Risorse
Prese
Utilizzando un protocollo personalizzato (più difficile)
Altri suggerimenti
Solo per il locale, abbiamo avuto successo utilizzando Named Pipes.Evita il sovraccarico di TCP ed è praticamente (almeno per .NET) il più efficiente possibile pur avendo un'API decente con cui lavorare.
Dato che sei limitato a .Net 2.0, WCF forse non è un'opzione.È possibile utilizzare la comunicazione remota .Net con memoria condivisa come meccanismo di comunicazione sottostante tra i domini delle app sullo stesso computer.Usando questo approccio puoi facilmente mettere i tuoi processi su macchine diverse e sostituire il protocollo di memoria condivisa con un protocollo di rete.
Il metodo standard per comunicare con un servizio Windows consiste nell'utilizzare i codici di controllo del servizio.I servizi Windows possono ricevere codici da 0 a 255.0-127 è riservato al sistema.Da 128 a 255 possono essere utilizzati per comandi personalizzati.
Se è necessario inviare oggetti complessi al servizio utilizzare database, xml, file, tcp, http ecc.Oltre a inviare comandi di controllo come ricaricare la configurazione, elaborare elementi, ecc., è necessario utilizzare questi codici di controllo.
Sono disponibili funzionalità aggiuntive come l'interrogazione del servizio.Consulta la documentazione e l'API del servizio Windows.
La soluzione migliore è utilizzare WCF.Sarai in grado di creare un host di servizio nel servizio Windows ed esporre un'interfaccia ben definita che l'applicazione GUI può utilizzare.WCF ti consentirà di comunicare tramite pipe denominate, se lo desideri, oppure puoi scegliere qualsiasi altro protocollo di comunicazione come TCP, HTTP, ecc.Utilizzando WCF ottieni un ottimo supporto per gli strumenti e molte informazioni disponibili.
Vorrei aggiungermi a questa discussione.Per favore rimproverami se è così fuori dal comune, ma non è possibile utilizzare un semaforo (o più semafori) per una comunicazione rudimentale?