<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4707791809580585433</id><updated>2011-04-21T19:31:32.627-07:00</updated><title type='text'>Programming Net with daily code samples</title><subtitle type='html'>Sample codes for a simple programming life</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gianlucaseno.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4707791809580585433/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gianlucaseno.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gianluca Seno</name><uri>http://www.blogger.com/profile/04220667680903082932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_iB5P2-z-xaI/R5tJ1N8O4wI/AAAAAAAAAAM/2Ufvo-pv8Ao/S220/pinguino_small.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4707791809580585433.post-7406969712459851060</id><published>2008-01-26T07:10:00.001-08:00</published><updated>2008-01-26T07:12:33.658-08:00</updated><title type='text'>Net Remoting in un Windows Service con IPC</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Net Remoting…se ne parla poco, ma recentemente l'ho usato per un mio applicativo e devo dire che mi è risultato molto utile ed ha permesso di risolvere parecchi problemi progettuali: in sintensi, si doveva creare un Windows service che compiva determinate operazioni ad intervalli di tempo regolari ma anche che fossero lanciate da un applicativo esterno. La soluzione più semplice è stata implementare un semplice applicativo in Net remoting con Visual Studio 2005 e Net 2.0: come breve introduzione, ricordo che il Net remoting non è altro che un metodo di comunicazione tra applicazioni attraverso canali aperti all'interno della stessa macchina (come l' IPC) o tra la macchina dove risiede l'applicativo server e i vari client che vogliono interagire con queste funzionalità via internet o via rete LAN (quindi attraverso il protocollo TCP e HTTP). Dato che la nostra applicazione sarà un Windows service che dovrà girare su un PC locale utilizzeremo il canale IPC, evitando, quindi, di aprire porte indisiderate che potrebbero rendere vulnerabile il sistema operativo.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Andiamo ad analizzare ora in dettaglio il metodo più semplice, efficace ma soprattutto veloce per sviluppare il nostro applicativo. Per prima cosa, creeremo una nuova soluzione con Visual Studio 2005, al proprio interno creeremo 3 progetti che elenco:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Class Library Interface&lt;/strong&gt;: in questa class library creeremo la nostra interfaccia per rendere pubblici i metodi a noi interessati attraverso Net Remoting. Per fare ciò, creare il nuovo progetto, cancellare la classe di default creata ed aggiungere un nuovo oggetto interfaccia.Il codice dovrà essere come segue:&lt;br/&gt;Namespace IRemotingObject&lt;br/&gt;     Public Interface IRemoteObject&lt;br/&gt;            Sub Task()&lt;br/&gt;         End Interface&lt;br/&gt;End Namespace&lt;br/&gt;&lt;br /&gt;				&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Class Library MarshalByRefObject&lt;/strong&gt;: in questa class library svilupperemo l'interfaccia precedentemente creata e inoltre dovremo ereditare MarshalByRefObject dalla reference System.Runtime.Remoting. Difatti, solo ereditandolo possiamo rendere una classe "ereditabile".&lt;br/&gt;In ogni caso andremo a sviluppare il nostro applicativo come segue:&lt;br/&gt;&lt;br/&gt;Namespace RemotingObject&lt;br/&gt;    Public Class RemoteObject&lt;br/&gt;            Inherits MarshalByRefObject&lt;br/&gt;            Implements IRemotingObject.IRemoteObject&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;            Public Sub New()&lt;br/&gt;            End Sub&lt;br /&gt;&lt;/p&gt;&lt;p&gt;            Public Sub ThreadProc ()&lt;br/&gt;            '...&lt;br/&gt;            End Sub        &lt;br /&gt;&lt;/p&gt;&lt;p style='margin-left: 35pt'&gt;Public Sub Task() Implements IRemotingObject.IRemoteObject.Task                     '....&lt;br/&gt;            End Sub&lt;br/&gt;    End Class&lt;br/&gt; End Namespace&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;&lt;strong&gt;Windows service&lt;/strong&gt;: tutti i dettagli per la realizzazione di un windows service magari li metterò in un altro post, ora basta mettere le basi. Creato il nostro progetto, entriamo  nel design del componente, premiamo tasto destro all'interno e vedremo che tra le varie opzioni ci sarà "Add Installer…": in questo modo, verrà aggiunto al nostro progetto un altro oggetto che ci consentirà di dare la configurazione generale al nostro servizio.&lt;br/&gt;Prima di tutto, ricordiamoci anche qui di includere tra le referenze il System.Runtime.Remoting e di importare i seguenti naspaces: System.Runtime.Remoting.Channels e System.Runtime.Remoting.Channels.Ipc.&lt;br/&gt;Il codice del nostro servizio, in ogni caso, sarà il seguente:&lt;br/&gt;Public Class ServiceComponent&lt;br/&gt;    Private ServiceThread As Thread&lt;br/&gt;    Private srv As New RemotingObject.RemoteObject&lt;br/&gt;    Private ipcchannel as IpcChannel&lt;br /&gt;&lt;/div&gt;&lt;p style='margin-left: 34pt'&gt;Protected Overrides Sub OnStart(ByVal args() As String)&lt;br/&gt;            ServiceThread = New Thread(New ThreadStart(AddressOf srv.ThreadProc))&lt;br/&gt;     ServiceThread.Start()&lt;br/&gt;            ServiceThread.IsBackground = True&lt;br/&gt;&lt;br /&gt;					&lt;/p&gt;&lt;p style='margin-left: 34pt'&gt;Dim props As New System.Collections.Hashtable()&lt;br/&gt;      props("portName") = " IPCChannelForExample"&lt;br/&gt;               props("exclusiveAddressUse") = False&lt;br/&gt;               props("authorizedGroup") = "Everyone"&lt;br/&gt;               ipcchannel = New IpcChannel(props, Nothing, Nothing)&lt;br /&gt;&lt;/p&gt;&lt;p style='margin-left: 70pt'&gt;ChannelServices.RegisterChannel(ipcchannel, False)        RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("RemotingObject.RemoteObject,RemoteObject"),"RemotingServer",WellKnownObjectMode.SingleCall)&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;               End Sub&lt;br /&gt;&lt;/p&gt;&lt;p style='margin-left: 70pt'&gt;Protected Overrides Sub OnStop()&lt;br/&gt;     ChannelServices.UnregisterChannel(ipcchannel)&lt;br/&gt;            ServiceThread.Abort()&lt;br/&gt; End Sub&lt;br /&gt;&lt;/p&gt;&lt;p style='margin-left: 35pt'&gt;End Class&lt;br /&gt;&lt;/p&gt;&lt;p&gt;E con questi 3 semplici passi (logicamente espandibili a piacimento). &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Per concludere, andiamo a vedere come chiamare il nostro metodo "Task" da un altro applicativo collegandoci via IPC al Windows service da, per esempio, un Windows Form.&lt;span style='text-decoration:underline'&gt;&lt;br /&gt;				&lt;/span&gt;Prima, però, ricordiamoci anche qui di includere tra le referenze il System.Runtime.Remoting e l'interfaccia creata precedentemente e di importare System.Runtime.Remoting.Channels e System.Runtime.Remoting.Channels.Ipc. Di seguito metto un semplice esempio di chiamata da un pulsante:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Private Sub TransmissionButton_ItemClick(ByVal sender As System.Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles TransmissionButton.ItemClick&lt;br/&gt;         Dim ipcCh As New IpcChannel("myClient")&lt;br/&gt;         ChannelServices.RegisterChannel(ipcCh, False)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;         Dim obj As IRemotingObject.IRemoteObject  = DirectCast(Activator.GetObject(GetType(IRemotingObject.IRemoteObject), "ipc://IPCChannelForExample/RemotingServer"), IRemotingObject.IRemoteObject)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        obj.Task()&lt;br /&gt;&lt;/p&gt;&lt;p&gt;        ChannelServices.UnregisterChannel(ipcCh)&lt;br/&gt;    End Sub&lt;br /&gt;&lt;/p&gt;&lt;p&gt;E con questo abbiamo creato il nostro semplice applicativo. Logicamente per la creazione dei vari canali IPC nel servizio è da ricordare che ci sono molte altre opzioni, anche per aumentare il livello di sicurezza, ma penso che il metodo più semplice utilizzo è come l'ho dimostrato: inoltre, impostandolo che deve "impersonalizzare" il gruppo "Everyone", tutti possono accedervi senza problemi di permissioni, problemi che mi son scontrato più volte prima di terminare il progetto.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4707791809580585433-7406969712459851060?l=gianlucaseno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gianlucaseno.blogspot.com/feeds/7406969712459851060/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4707791809580585433&amp;postID=7406969712459851060' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4707791809580585433/posts/default/7406969712459851060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4707791809580585433/posts/default/7406969712459851060'/><link rel='alternate' type='text/html' href='http://gianlucaseno.blogspot.com/2008/01/net-remoting-in-un-windows-service-con.html' title='Net Remoting in un Windows Service con IPC'/><author><name>Gianluca Seno</name><uri>http://www.blogger.com/profile/04220667680903082932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_iB5P2-z-xaI/R5tJ1N8O4wI/AAAAAAAAAAM/2Ufvo-pv8Ao/S220/pinguino_small.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4707791809580585433.post-7287660050618292692</id><published>2008-01-26T06:50:00.000-08:00</published><updated>2008-01-26T06:52:45.732-08:00</updated><title type='text'>Presentazione</title><content type='html'>&lt;span style="font-family:trebuchet ms;font-size:130%;"&gt;Ciao a tutti,&lt;br /&gt;finalmente mi sono deciso a pubblicare un mio blog tecnico....e si sono un pò pigrone da questo punto di vista, ma dopo aver navigato per internet per trovare le soluzioni più disparate ai miei problemi mi son detto..."ei, è ora di dare qualcosa anche te!"&lt;br /&gt;Ed eccoci quà...sperò che i miei codici di esempio riportati dalla vita di tutti i giorni lavorativa vi possano essere d'aiuto!&lt;br /&gt;E leggetemi spesso, mi raccomando!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4707791809580585433-7287660050618292692?l=gianlucaseno.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gianlucaseno.blogspot.com/feeds/7287660050618292692/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4707791809580585433&amp;postID=7287660050618292692' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4707791809580585433/posts/default/7287660050618292692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4707791809580585433/posts/default/7287660050618292692'/><link rel='alternate' type='text/html' href='http://gianlucaseno.blogspot.com/2008/01/presentazione.html' title='Presentazione'/><author><name>Gianluca Seno</name><uri>http://www.blogger.com/profile/04220667680903082932</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_iB5P2-z-xaI/R5tJ1N8O4wI/AAAAAAAAAAM/2Ufvo-pv8Ao/S220/pinguino_small.jpg'/></author><thr:total>0</thr:total></entry></feed>
