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!

È stato utile?

Soluzione

L'IPC in .Net può essere ottenuto utilizzando:

WCF

utilizzando pipe denominate richiede .Net 3.0 e al di sopra.

Esempio di codice


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


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:

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.

http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top