<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//az//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.5.12</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Mon, 16 Nov 2009 20:45:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//az//</link></image><item><title>Mono e Framework... un po&amp;#39; di semplici benchmark parte seconda</title><link>http://blogs.aspitalia.com/az/post2570/Mono-Framework.-Podi-Semplici-Benchmark-Parte.aspx</link><pubDate>Mon, 16 Nov 2009 20:45:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2570" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Poco più di un anno fa avevo scritto un &lt;a title="link esterno" href="http://blogs.aspitalia.com/az/post2419/mono-framework.-podi-semplici-benchmark.aspx"&gt;blog&lt;/a&gt; dove avevo confrontato le prestazioni di una windows forms scritta in .net su una macchina con Windows XP e una macchina Linux con la versione 1.9 di mono. In questi mesi Mono ha raggiunto la versione 2.4 e gode di ottima salute malgrado ci siano i soliti estremisti che solo all'idea di una tecnologia portata dal mondo Microsoft stanno male. Anche se sempre un paio di versioni indietro da ciò che il Framework offre su sistemi operativi Microsoft, siamo ormai giunti anche al supporto di Linq, di cui potrei parlare in un blog futuro sempre se ne avrò voglia. Per questo lunedì sera mi accontenterò di rifare lo stesso test di un anno fa con l'ultima versione di Mono che gira sull'ultima versione di Ubuntu (9.10) e sempre sulla stessa macchina. Ecco il risultato della piccola applicazione la cui descrizione delle operazioni che esegue ho spiegato nel &lt;a title="link esterno" href="http://blogs.aspitalia.com/az/post2419/mono-framework.-podi-semplici-benchmark.aspx"&gt;blog&lt;/a&gt; prima citato:&lt;/p&gt;&lt;p&gt;&lt;img alt="test mono 2.4 su ubuntu" title="test mono 2.4" src="http://blogs.aspitalia.com/img/andrewz/schermatakarmic32.png" /&gt;&lt;/p&gt;Stupito. Per quanto può valere questo banale test nel calcolo degli interi e dei &lt;em&gt;double&lt;/em&gt;le prestazioni sono migliorate nettamente, ma anche a confronto della versione originale del Framework che gira su Windows:&lt;br /&gt;&lt;br /&gt;&lt;table cellspacing="2" cellpadding="0" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Integer&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Double&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Xml 1&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Xml 2&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Windows .net&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;453,125s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;1859,375s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;46,875s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;4640,625s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Mono 1.9&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;499,71s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;2362.398s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;259,891s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;26959,493s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Mono 2.4&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;286,46s&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;1314,403&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;475,253&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;em&gt;23604,915&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;Grande velocità nella trattazione dei numeri ma nella gestione dei file e xml fa ancora parecchio schifo.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=4702ba77-5ad7-825e-8fff-ae73ee648784" /&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2570/Mono-Framework.-Podi-Semplici-Benchmark-Parte.aspx"&gt;&lt;em&gt;Mono e Framework... un po&amp;#39; di semplici benchmark parte seconda&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2570/Mono-Framework.-Podi-Semplici-Benchmark-Parte.aspx</guid><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2570/Mono-Framework.-Podi-Semplici-Benchmark-Parte.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2570.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2570</trackback:ping></item><item><title>Moonlight - Silverlight 1-2</title><link>http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx</link><pubDate>Wed, 21 Jan 2009 08:27:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2453" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Da scoprire a installare Moonlight 1.0 è passato un attimo. &lt;a href="http://go-mono.com/moonlight/" title="link esterno"&gt;Installazione&lt;/a&gt; veloce che richiede solo il riavvio di Firefox come ogni suo plug-in. L'inizio dei test avviene qualche minuto dopo. Innanzitutto: &lt;strong&gt;Moonlight 1.0 è la versione 1 di Silverlight! Per vedere le applicazioni scritte in Silverlight 2 si dovrà aspettare la versione 2.0 di Moonlight&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Le prove. Dai miei test sulle applicazioni scritte in Silverlight 1, solo il ~60% gira senza problemi. Mi ha sorpreso vedere filmati girare senza problemi e altre molto più semplici visualizzare solo un rettangolo grigio e niente altro.&lt;/p&gt; &lt;p&gt;Quando sarà disponibile la versione 2.0? &lt;a href="http://www.mono-project.com/MoonlightRoadmap" title="link esterno"&gt;Qui&lt;/a&gt; le risposte.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx"&gt;&lt;em&gt;Moonlight - Silverlight 1-2&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono, .NET Framework, Silverlight, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2453/Moonlight-Silverlight-12.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2453.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2453</trackback:ping></item><item><title>Mono e Framework... un po&amp;#39; di semplici benchmark</title><link>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx</link><pubDate>Tue, 28 Oct 2008 08:29:50 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2419" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;em&gt;&amp;quot;Ma prestazionalmente, sulla stessa macchina, quant'è la differenza tra un'applicazione che gira sul Framework e sistema operativo Microsoft e la stessa su Linux con Mono?&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa era una richiesta che mi era stata fatta parecchio tempo fa, ma per questione di voglia o altro non l'avevo mai fatta. Allora ho scritto una semplice &lt;em&gt;windows forms&lt;/em&gt; che facesse delle operazioni ripetute su questi semplici scenari:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Calcolo con interi: banale calcolo con soli numeri interi.&lt;/li&gt; &lt;li&gt;Calcolo con decimal: come sopra, ma con l'uso dei decimali.&lt;/li&gt; &lt;li&gt;Lettura completa di un documento &lt;em&gt;xml&lt;/em&gt; da 300KB e 44.000 nodi, con il &lt;em&gt;SelectNodes&lt;/em&gt;, nodo per nodo.&lt;/li&gt; &lt;li&gt;Apertura ripetuta dello stesso documento &lt;em&gt;xml&lt;/em&gt; ripetutamente con ricerca di nodi all'interno dello stesso.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Innanzitutto vediamo l'applicazione in esecuzione:&lt;/p&gt; &lt;p&gt;&lt;img height="402" alt="schermata-benchmark .net2" src="http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net2_3.png" width="385" border="0" /&gt; &lt;/p&gt; &lt;p&gt;E su Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img height="427" alt="schermata-benchmark .net mono" src="http://blogs.aspitalia.com/img/andrewz/monoeframework.unpodisemplicibenchmark_8355/schermata-benchmark%20.net_3.png" width="387" border="0" /&gt; &lt;/p&gt; &lt;p&gt;Riassumendo i risultati in una tabella:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt; &lt;tr&gt; &lt;td  width="80"&gt;&amp;nbsp;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Integer&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Double&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Xml 1&lt;/strong&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;strong&gt;Xml 2&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="80"&gt;&lt;em&gt;&lt;strong&gt;Windows .net&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;453,125s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;1859,375s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;46,875s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;4640,625s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td  width="80"&gt;&lt;em&gt;&lt;strong&gt;Mono&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;499,71s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;2362.398s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;259,891s&lt;/em&gt;&lt;/td&gt; &lt;td  width="80"&gt;&lt;em&gt;26959,493s&lt;/em&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;NB:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;La piccola applicazione è stata scritta con &lt;em&gt;Visual Studio 2008&lt;/em&gt; per il&lt;em&gt; Framework 2.0&lt;/em&gt;.&lt;/li&gt; &lt;li&gt;Il computer su cui girava &lt;em&gt;Mono&lt;/em&gt; aveva &lt;em&gt;Ubuntu&lt;/em&gt; 8.10 RC.&lt;/li&gt; &lt;li&gt;Ho potuto usare solo la versione 1.9 di &lt;em&gt;Mono&lt;/em&gt; e non la nuova 2.0, ma purtroppo non potevo testare la nuova versione sul computer a disposizione.&lt;/li&gt; &lt;li&gt;Notare le piccole imperfezioni grafiche della versione &lt;em&gt;Mono&lt;/em&gt;, teoricamente risolte con la nuova versione.&lt;/li&gt; &lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx"&gt;&lt;em&gt;Mono e Framework... un po&amp;#39; di semplici benchmark&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2419/Mono-Framework.-Podi-Semplici-Benchmark.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2419.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2419</trackback:ping></item><item><title>GTK, giusta crocevia tra piattaforme?</title><link>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx</link><pubDate>Sun, 26 Oct 2008 12:57:50 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2414" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Non ho mai fatto segreto della mia passione per &lt;em&gt;&lt;a title="link esterno" href="http://it.wikipedia.org/wiki/mono_(progetto)"&gt;Mono&lt;/a&gt;&lt;/em&gt;, porting del &lt;em&gt;Framework .Net&lt;/em&gt; su sistemi operativi non &lt;em&gt;Microsoft&lt;/em&gt;. Passi da gigante sono stati fatti per la compatibilità delle stesse applicazioni su sistemi operativi differenti, soprattutto per applicazioni desktop (sono fondamentalmente contro all'utilizzo di questo porting per webapplication, visto che il risparmio dovuto ad hosting e licenze dei sistemi operativi sia ridicolo di fronte allo sforzo per la realizzazione di web application che girino perfettamente con Mono - ma questo è assolutamente IMHO!).&lt;/p&gt; &lt;p&gt;Da qualche giorno è uscita la versione 2.0 di &lt;a title="link esterno" href="http://www.mono-project.com/main_page"&gt;&lt;em&gt;Mono&lt;/em&gt;&lt;/a&gt;. E' aumentata notevolmente la compatibilità con le applicazini scritte con il Framework nativo della &lt;em&gt;Microsoft&lt;/em&gt;. Ora è possibile lanciare moltissime applicazioni &lt;em&gt;windows forms&lt;/em&gt; su &lt;em&gt;Linux&lt;/em&gt; con &lt;em&gt;Mono&lt;/em&gt; senza trovare grosse differenze e problematiche nell'uso dell'interfaccia grafica (cosa che avveniva in modo pesante con la versione 1.2 e, in modo minore, con la 1.9.1).&lt;/p&gt; &lt;p&gt;Nel poco tempo che riesco a dedicare a &lt;em&gt;Mono&lt;/em&gt; per miei test, ho trovato ideale l'utilizzo di una libreria esterna per la creazione e l'utilizzo delle interfacce grafiche, compatibile con entrambi i mondi, Windows e Linux. E' il progetto &lt;a title="link esterno" href="http://www.mono-project.com/gtksharp"&gt;Gtk#&lt;/a&gt;, libreria che permette l'utilizzo di &lt;a title="link esterno" href="http://www.gtk.org/"&gt;Gtk+&lt;/a&gt; che, ricordo, è la libreria grafica utilizzata dal &lt;em&gt;Desktop environment&lt;/em&gt;, &lt;em&gt;Gnome&lt;/em&gt;. Inoltre è utilizzata già con successo da molti altri programmi multi piattaforma, come &lt;em&gt;&lt;a title="link esterno" href="http://www.pidgin.im/"&gt;Pidgin&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Il suo utilizzo in applicazioni .&lt;em&gt;Net&lt;/em&gt; su sistemi operativi &lt;em&gt;Linux&lt;/em&gt; non necessita di alcuno sforzo visto che nel caso di &lt;em&gt;Gnome&lt;/em&gt; è già installata la libreria &lt;em&gt;Gtk&lt;/em&gt;, nel caso di altri &lt;em&gt;Desktop environment&lt;/em&gt; - &lt;em&gt;Kde&lt;/em&gt; - è sufficiente installare tale libreria. Installazione necessaria anche sotto &lt;em&gt;Windows&lt;/em&gt; da questo &lt;a title="link esterno" href="http://gladewin32.sourceforge.net/"&gt;link&lt;/a&gt; da dove si devono scaricare sia la libreria &lt;em&gt;Gtk+&lt;/em&gt;, sia &lt;em&gt;Glade&lt;/em&gt;, e infine la &lt;a title="link esterno" href="http://developer.novell.com/wiki/index.php/special:downloads/gtk-sharp/gtk-sharp~~~runtime"&gt;Gtk#&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;La costruzione dell'interfacce grafica è semplice, grazie a programmi appositi, come &lt;em&gt;Glade&lt;/em&gt; (programma scaricato prima), che permette la creazione di interfacce grafiche in modo molto simile a &lt;em&gt;Visual Studio&lt;/em&gt;. L'output di questo programma è un &lt;em&gt;xml&lt;/em&gt; che, incluso nel nostro progetto con &lt;em&gt;Visual Studio&lt;/em&gt; definito come "&lt;em&gt;Embedded Resource&lt;/em&gt;" utilizzeremo in questo modo:&lt;/p&gt; &lt;p&gt;&lt;em&gt;public GtkApp(string []args)&lt;br /&gt; {&lt;br /&gt; Application.Init(); &lt;br /&gt; Glade.XML gxml = new Glade.XML (null, "googleSearch.googlesearch.glade", &lt;br /&gt; "mainWindow", null);&lt;br /&gt; gxml.Autoconnect (this);&lt;br /&gt; mainWindow.DeleteEvent+=new DeleteEventHandler(mainWindow_DeleteEvent);&lt;br /&gt; btnSearch.Clicked+=new EventHandler(btnSearch_Clicked);&lt;br /&gt; btnClear.Clicked+=new EventHandler(btnClear_Clicked);&lt;br /&gt; Application.Run();&lt;br /&gt; }&lt;/em&gt; &lt;p&gt;Un esempio completo (da cui ho preso questa porzione di codice) lo si trova in questa pagina di &lt;em&gt;&lt;a title="link esterno" href="http://www.codeproject.com/kb/cross-platform/googlesearch.aspx"&gt;CodeProject&lt;/a&gt;&lt;/em&gt;. Dopo aver caricato l'interfaccia grafica si connette da codice gli eventi agli oggetti come i button all'interno dell'interfaccia grafica. Tutto fatto.&lt;/p&gt; &lt;p&gt;Abbiamo a disposizione altre interfacce grafiche comuni tra i sistemi operativi, come la famosa libreria &lt;em&gt;&lt;a title="link esterno" href="http://www.wxwidgets.org/"&gt;wxwidgets&lt;/a&gt;&lt;/em&gt; e il suo porting in &lt;em&gt;.Net&lt;/em&gt;, &lt;em&gt;&lt;a title="link esterno" href="http://wxnet.sourceforge.net/"&gt;wxwidgets.net&lt;/a&gt;&lt;/em&gt;. Potente flessibile, ma ha grossi problemi di stabilità almeno sotto &lt;em&gt;windows&lt;/em&gt; dove &lt;strong&gt;crolla&lt;/strong&gt; spesso e volentieri in errori inspiegabili - almeno per me.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx"&gt;&lt;em&gt;GTK, giusta crocevia tra piattaforme?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2414/GTK-Giusta-Crocevia-Piattaforme.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2414.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2414</trackback:ping></item><item><title>Mono e Remoting: come scambiare informazioni tra Windows e Linux</title><link>http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx</link><pubDate>Fri, 11 Jul 2008 18:44:31 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2321" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un blog &lt;a title="blog precedente per la creazione di servizi con mono" href="http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx"&gt;precedente&lt;/a&gt; avevo spiegato come creare un servizio con C# e Mono per macchine Linux. Oggi voglio &lt;em&gt;complicare&lt;/em&gt; un po' le cose, perché l'obbiettivo a cui voglio giungere è lo scambio di informazioni tra i &lt;em&gt;due mondi&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;La prima soluzione che potrebbe venire in mente è l'utilizzo dei web services. Subito però nasce un problema di base: per poterli utilizzare dobbiamo avere un web server che gira sulla macchina, e questo non è sempre una buona soluzione perché necessità di installazioni e sistemi operativi che consentono questa operazione. Nel mondo Windows è necessario avere almeno Windows Xp Professional oppure Vista. Con qualsiasi distribuzione Linux dobbiamo &lt;a title="articolo su mono in apitalia.com" href="http://www.aspitalia.com/articoli/asp.net/mono.aspx"&gt;installare&lt;/a&gt; Apache e il modulo apposito perché possano essere elaborate le pagine asp.net. Ne vale la pena? No, perché il mondo .Net permette un mezzo più potente per lo scambio di dati tra ambienti in cui gira il Framework: il &lt;strong&gt;Remoting&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Quei quattro gatti che mi conoscono, sanno la mia passione per il Remoting fin dalla versione 1.1 del Framework. Questa tecnologia permette lo scambio di oggetti tra applicativi scritti in .Net senza la necessità di web server, inoltre possiamo utilizzare la serializzazione binaria per la trasmissione di dati molto più prestazionale che la tradizionale SOAP via HTTP (anche se con il Remoting possiamo utilizzare sia la serializzazione SOAP, sia il trasferimento con il protocollo HTTP). Dal Framework 3.0 è presente la tecnologia WCF, molto più potente, ma il mondo Mono è ancora indietro e l'implementazione di WCF e delle novità presenti dal Framework 3.0 (nome in codice &lt;a title="link esterno" href="http://www.mono-project.com/olive"&gt;Olive&lt;/a&gt; sotto Mono) sono ancora abbastanza indietro.&lt;/p&gt; &lt;p&gt;Un articolo che confrontava i due mondi - Remoting vs web services - lo potete trovare &lt;a title="mio articolo per aspitalia.com per il remoting e ws" href="http://www.aspitalia.com/articoli/asp.net/webservices_remoting_wse2.aspx"&gt;qui&lt;/a&gt;. Per spiegare meglio la soluzione proposta in questo blog, ho scritto un banale progetto con MonoDevelop che è possibile scaricare dal link a fondo pagina. Questo piccolo progetto ripropone quanto già detto nel blog riguardante la creazione di servizi con Mono. Per questa occasione ho aggiunto al servizio la possibilità di richiamare una funzione all'interno di una classe direttamente grazie al Remoting.&lt;/p&gt; &lt;p&gt;Innanzitutto, il file allegato presenta tre progetti:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Servizio che attende le chiamate via Remoting.&lt;/li&gt; &lt;li&gt;Client che richiama la funzione via Remoting al servizio.&lt;/li&gt; &lt;li&gt;Classe con l'interfaccia per lo scambio di informazioni.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Il progetto con l'interfaccia è una banale classe con questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using System;&lt;br /&gt;public interface IRequestInformation&lt;br /&gt;{&lt;br /&gt; string GetNameAndDateTime(string name);&lt;br /&gt;}&lt;/em&gt; &lt;p&gt;Molto banale: è una funzione che accetta come parametro una stringa e ritorna un'altra stringa. Ora nel servizio dobbiamo esporre questa interfaccia con una classe all'interno del servizio. Nulla di complesso: &lt;p&gt;&lt;em&gt;private void _MainLoop ()&lt;br /&gt;{&lt;br /&gt; TcpChannel channel = new TcpChannel(1981);&lt;br /&gt; ChannelServices.RegisterChannel(channel,false);&lt;br /&gt; RemotingConfiguration.RegisterWellKnownServiceType(&lt;br /&gt; typeof(Information),&lt;br /&gt; "RemotingMessage",WellKnownObjectMode.SingleCall);&lt;br /&gt; MainClass.WriteLog(ServiceName, "Remoting started..."); &lt;br /&gt; while (!stopThread)&lt;br /&gt; Thread.Sleep (2000);&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;_MainLoop è la funzione che è possibile trovare spiegata nel blog &lt;a title="mio blog precedente per la creazione di un servizio con mono per linux" href="http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx"&gt;precedente&lt;/a&gt;. In quell'esempio era presente solo il ciclo while, ora è stato aggiunto il codice per l'attesa di chiamate dalla porta Tcp 1981 della classe "Information": &lt;p&gt;&lt;em&gt;namespace service1&lt;br /&gt;{&lt;br /&gt; public class Information:MarshalByRefObject, IRequestInformation&lt;br /&gt; {&lt;br /&gt; public Information()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; public string GetNameAndDateTime (string name)&lt;br /&gt; {&lt;br /&gt; MainClass.WriteLog("Remoting", "received: "+name); // scrive log&lt;br /&gt; return string.Format("{0}: {1}",name, DateTime.Now);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa classe espone l'interfaccia &lt;em&gt;IRequestInformation&lt;/em&gt; e il metodo &lt;em&gt;GetNameAndDateTime&lt;/em&gt;. Siccome mi manca la fantasia non faccio altro che tornare una stringa contenente il &lt;em&gt;name&lt;/em&gt; passato insieme alla data e ora attuale.&lt;/p&gt; &lt;p&gt;Il progetto client allegato è una console application che richiama via remoting la funzione presente nel servizio:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using System;&lt;br /&gt;using System.Runtime.Remoting;&lt;br /&gt;using System.Runtime.Remoting.Channels;&lt;br /&gt;using System.Runtime.Remoting.Channels.Tcp;&lt;br /&gt;&lt;br /&gt;namespace client&lt;br /&gt;{&lt;br /&gt; class MainClass&lt;br /&gt; {&lt;br /&gt; public static void Main(string[] args)&lt;br /&gt; {&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt; string name="io"; // Stringa di default se non vengono passati parametri&lt;br /&gt; if (args.Length&amp;gt;0) name=args[0];&lt;br /&gt; IRequestInformation remot;&lt;br /&gt; string location = "tcp://192.168.0.7:1981/RemotingMessage";&lt;br /&gt; remot = (IRequestInformation)Activator.GetObject(&lt;br /&gt; typeof(IRequestInformation), location);&lt;br /&gt; Console.WriteLine(remot.GetNameAndDateTime(name));&lt;br /&gt; }&lt;br /&gt; catch (RemotingException)&lt;br /&gt; {&lt;br /&gt; Console.WriteLine("Impossibile comunicare con il server");&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche qui viene usato l'interfaccia per la creazione automatica per l'utilizzo della classe presente nel servizio. Il Framework penserà al posto nostro alla creazione di una classe proxy per la serializzazione binaria e la trasmissione.&lt;/p&gt; &lt;p&gt;Se si è seguito il blog precedente e il servizio gira sulla macchina (sia che si tratti di Windows che Linux), possiamo richiamare il servizio direttamente dall'eseguibile client:&lt;/p&gt; &lt;p&gt;&lt;img alt="client su macchina windows" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting2.png" /&gt; &lt;/p&gt; &lt;p&gt;Questo anche da altre macchine Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img alt="client su macchina linux" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting3.png" /&gt;&lt;/p&gt; &lt;p&gt;In entrambi i casi il servizio ha risposta ritornando correttamente la stringa passata con la data e l'ora della richiesta. Inoltre, il nostro servizio è in grado di loggare le richieste. Vediamo che cosa ha memorizzato:&lt;/p&gt; &lt;p&gt;&lt;img alt="log del servizio" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting1.png" /&gt;&lt;/p&gt; &lt;p&gt;Il codice presente nell'allegato ha l'ip e la porta memorizzati direttamente nel codice, per modificarli è necessario ricompilare i progetti. Potevo configurare il Remoting con il file di configurazione del progetto, lo so, ma non ne avevo voglia. Ma se volete provarlo o avete questa strada o fate in modo che il servizio sia memorizzato da una macchina con ip 192.168.0.7.&lt;/p&gt; &lt;p&gt;Una piccola divagazione a margine: come detto nel blog precedente i test sono stati fatti su una macchina con Ubuntu. A parte la versione vecchia di Mono presente nei repository di questa distribuzione, ho scoperto un'altra anomalia. Con l'esempio presente che comunica con porte TCP, mi aspettavo di dover configurare il firewall, proprio come Windows richiede. Con Ubuntu non ho avuto alcun problema. I pacchetti sono passati senza problemi. Dopo una piccola ricerca scopro che Ubuntu ha sì il firewall attivo, &lt;strong&gt;&lt;em&gt;ma permette il passaggio indiscrimanto da qualsiasi porta! &lt;/em&gt;&lt;/strong&gt;La più famosa, e forse utilizzata, distribuzione Linux ha un firewall pressocché inutilizzato! La cosa mi ha sorpreso dato che, per esempio, OpenSuse ha il suo bel firewall attivo... Roba da Windows 2000... per fortuna almeno non ha gli stessi problemi di sicurezza.&lt;/p&gt; &lt;p&gt;Dimenticavo: l'allegato è possibile scaricarlo da questo &lt;a title="progetto d'esempio per il remoting" href="http://blogs.aspitalia.com/img/andrewz/upload/service1.zip"&gt;link&lt;/a&gt;. La piadina che ho mangiato a cena ce l'ho ancora sullo stomaco. Questa è un'altra divagazione.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx"&gt;&lt;em&gt;Mono e Remoting: come scambiare informazioni tra Windows e Linux&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2321.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2321</trackback:ping></item><item><title>Servizi in C# su macchine Linux con Mono</title><link>http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx</link><pubDate>Sun, 06 Jul 2008 19:05:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2308" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Pochi giorni fa ho dovuto rifarmi una macchina su cui girava OpenSuse (la distribuzione che preferisco), ed ho deciso di installare la nuova versione di Ubuntu 8.04 per curiosità visto che l'ultima versione provata di Ubuntu era la 7.04 e volevo provare con mano l'evoluzione avvenuta in questi dodici mesi.&lt;/p&gt;&lt;p&gt;La prima delusione l'ho avuta nel constatare che la versione presente nei repository di Mono è la 1.2.6, mentre l'ultima release è la 1.9.1. Non mi pongo problemi, e visto che dovevo installare un servizio per... ehi, un momento, non sono obbligato a scrivere nel dettaglio i fatti miei! Riprendo: dovendo installare un servizio scritto in C# su questa macchina installo &lt;em&gt;mono&lt;/em&gt; e &lt;em&gt;mono-service2&lt;/em&gt; dai repository di Ubuntu. &lt;em&gt;mono-service2&lt;/em&gt; è un tool che permette la gestione dei servizi scritti per Mono sotto Linux.&lt;/p&gt;&lt;p&gt;Per informazione riporto un pubblico esempio di un servizio scritto in C# che può girare sia sotto Windows che Linux. Il codice seguente è possibile compilarlo Visual Studio, da linea di comando sotto Linux con Mono o con MonoDevelop, e può essere testato anche come &lt;em&gt;console application&lt;/em&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;// Main.cs created with MonoDevelop&lt;br /&gt;// User: az&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.ServiceProcess;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Configuration.Install;&lt;br /&gt;using System.Threading;&lt;br /&gt;&lt;br /&gt;namespace service1&lt;br /&gt;{&lt;br /&gt; class MainClass&lt;br /&gt; {&lt;br /&gt;  private const string LogFile = &amp;quot;TestService.log&amp;quot;;&lt;br /&gt;&lt;br /&gt;  // The main entry point for the process&lt;br /&gt;  static void Main()&lt;br /&gt;  {&lt;br /&gt;   Write2Log(null, &amp;quot;Main starting&amp;quot;);&lt;br /&gt;   System.ServiceProcess.ServiceBase[] ServicesToRun;&lt;br /&gt;   ServicesToRun = new System.ServiceProcess.ServiceBase[] { new TestService(&amp;quot;TestService1&amp;quot;)};&lt;br /&gt;   System.ServiceProcess.ServiceBase.Run(ServicesToRun);&lt;br /&gt;   Write2Log(null, &amp;quot;Main ended&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void Write2Log(string category, string message)&lt;br /&gt;  {&lt;br /&gt;   using (StreamWriter w = new StreamWriter(LogFile, true, System.Text.Encoding.UTF8) )&lt;br /&gt;   {&lt;br /&gt;    if ( category != null )&lt;br /&gt;     w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + category + &amp;quot; - &amp;quot; + message);&lt;br /&gt;    else&lt;br /&gt;     w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + message);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public class TestService : System.ServiceProcess.ServiceBase&lt;br /&gt; {&lt;br /&gt;  private Thread mainThread = null;&lt;br /&gt;  private bool stopThread = false;&lt;br /&gt;&lt;br /&gt;  public TestService(string name)&lt;br /&gt;  {&lt;br /&gt;   this.ServiceName = name;&lt;br /&gt;   this.CanPauseAndContinue = true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void Dispose( bool disposing )&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Dispose&amp;quot;);&lt;br /&gt;   base.Dispose( disposing );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnStart(string[] args)&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Starting Service...&amp;quot;);   &lt;br /&gt;   mainThread = new Thread (new ThreadStart (_MainLoop));&lt;br /&gt;   stopThread = false;&lt;br /&gt;   mainThread.Start ();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnStop()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Stopping Service...&amp;quot;);&lt;br /&gt;   if (mainThread != null) {&lt;br /&gt;    stopThread = true;&lt;br /&gt;    mainThread.Join ();&lt;br /&gt;    mainThread = null;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnPause()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Pausing Service...&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnContinue()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Continuing Service...&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void _MainLoop ()&lt;br /&gt;  {&lt;br /&gt;   while (!stopThread)&lt;br /&gt;    Thread.Sleep (2000);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /// &lt;summary /&gt;&lt;br /&gt; /// This class allows easy installation of this service on Windows.&lt;br /&gt; /// &lt;/summary /&gt;&lt;br /&gt; [RunInstaller(true)]&lt;br /&gt; public class ProjectInstaller : System.Configuration.Install.Installer&lt;br /&gt; {&lt;br /&gt;  private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;&lt;br /&gt;  private System.ServiceProcess.ServiceInstaller serviceInstaller1;&lt;br /&gt;  private System.ComponentModel.Container components = null;&lt;br /&gt;&lt;br /&gt;  public ProjectInstaller()&lt;br /&gt;  {&lt;br /&gt;   // This call is required by the Designer.&lt;br /&gt;   InitializeComponent();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &lt;summary /&gt;&lt;br /&gt;  /// Clean up any resources being used.&lt;br /&gt;  /// &lt;/summary /&gt;&lt;br /&gt;  protected override void Dispose( bool disposing )&lt;br /&gt;  {&lt;br /&gt;   if( disposing )&lt;br /&gt;   {&lt;br /&gt;    if(components != null)&lt;br /&gt;    {&lt;br /&gt;     components.Dispose();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   base.Dispose( disposing );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  #region Component Designer generated code&lt;br /&gt;  /// &lt;summary /&gt;&lt;br /&gt;  /// Required method for Designer support - do not modify&lt;br /&gt;  /// the contents of this method with the code editor.&lt;br /&gt;  /// &lt;/summary /&gt;&lt;br /&gt;  private void InitializeComponent()&lt;br /&gt;  {&lt;br /&gt;   this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();&lt;br /&gt;   this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;   //this.serviceInstaller2 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;   // &lt;br /&gt;   // serviceProcessInstaller1&lt;br /&gt;   // &lt;br /&gt;   this.serviceProcessInstaller1.Password = null;&lt;br /&gt;   this.serviceProcessInstaller1.Username = null;&lt;br /&gt;   // &lt;br /&gt;   // serviceInstaller1&lt;br /&gt;   // &lt;br /&gt;   this.serviceInstaller1.DisplayName = &amp;quot;Test Service 1&amp;quot;;&lt;br /&gt;   this.serviceInstaller1.ServiceName = &amp;quot;TestService1&amp;quot;;&lt;br /&gt;   // &lt;br /&gt;   // ProjectInstaller&lt;br /&gt;   // &lt;br /&gt;   this.Installers.AddRange(new System.Configuration.Install.Installer[] {&lt;br /&gt;       this.serviceProcessInstaller1,&lt;br /&gt;       this.serviceInstaller1&lt;br /&gt;     });&lt;br /&gt;  }&lt;br /&gt;  #endregion&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Questo servizio è solo un test: scrive in un file di testo quando il servizio viene avviato e quando viene fermato. Una volta testato e confermato il suo funzionamento corretto, provo ad installarlo come servizio sotto Ubuntu con &lt;em&gt;mono-service2&lt;/em&gt;. L'help di questo comando è molto chiaro:&lt;/p&gt;&lt;code&gt;az:~$ mono-service2 &lt;br /&gt;You must specify at least the assembly name&lt;br /&gt;&lt;br /&gt;Usage is: /usr/bin/mono-service2 [options] service&lt;br /&gt;&lt;br /&gt;    -d:&lt;directory /&gt;         Working directory&lt;br /&gt;    -l:&lt;lock /&gt;         Lock file (default is /tmp/&lt;service /&gt;.lock)&lt;br /&gt;    -m:&lt;syslog /&gt;       Name to show in syslog&lt;br /&gt;    -n:&lt;service /&gt;      Name of service to start (default is first defined)&lt;br /&gt;    --debug                Do not send to background nor redirect input/output&lt;br /&gt;    --no-daemon            Do not send to background nor redirect input/output&lt;br /&gt;&lt;br /&gt;Controlling the service:&lt;br /&gt;&lt;br /&gt;    kill -USR1 `cat &lt;lock /&gt;`    Pausing service&lt;br /&gt;    kill -USR2 `cat &lt;lock /&gt;`    Continuing service&lt;br /&gt;    kill `cat &lt;lock /&gt;`          Ending service&lt;br /&gt;&lt;br /&gt;az:~$ &lt;/code&gt;&lt;p&gt;Ok, vado nella directory dove è presente il codice compilato del servizio e lancio il comando con l'opzione della &lt;em&gt;working directory&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;sudo mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;/code&gt;&lt;p&gt;Ma ottengo un non precisato errore: &amp;quot;41: Syntax error: Bad fd number&amp;quot;. Una veloce ricerca e trovo che è un &lt;a title="Link esterno" href="https://bugs.launchpad.net/ubuntu/+source/mono/+bug/242925"&gt;bug&lt;/a&gt; noto sotto Ubuntu. Sempre a quel link è presente la correzione da fare, anche se un modo migliore per risolvere ogni problema lo spiegherò dopo.&lt;/p&gt;&lt;p&gt;Finalmente tutto funziona. Ora per fare le cose per bene dobbiamo fare in modo che tale servizio sia avviato in automatico all'avvio della macchina, senza nessuna autenticazione dell'utente. Per ottenere questo è necessario creare uno script apposito in &amp;quot;/etc/init.d/&amp;quot;. Lo script, che chiamerò &amp;quot;azservice&amp;quot; è il seguente:&lt;/p&gt;&lt;code&gt;#!/bin/sh&lt;br /&gt;# Start/stop the az daemon.&lt;br /&gt;#&lt;br /&gt;### BEGIN INIT INFO&lt;br /&gt;# Provides:          service1&lt;br /&gt;# Short-Description: Test di AZ&lt;br /&gt;# Description:       Service write in C# for mono and linux world&lt;br /&gt;### END INIT INFO&lt;br /&gt;&lt;br /&gt;. /lib/lsb/init-functions&lt;br /&gt;&lt;br /&gt;case &amp;quot;$1&amp;quot; in&lt;br /&gt;start) log_daemon_msg &amp;quot;Starting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt; ;;&lt;br /&gt;stop) log_daemon_msg &amp;quot;Stopping test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; kill `cat /tmp/service1.exe.lock`&lt;br /&gt;        ;;&lt;br /&gt;restart) log_daemon_msg &amp;quot;Restarting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; kill `cat /tmp/service1.exe.lock`&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;        ;;&lt;br /&gt;reload|force-reload) log_daemon_msg &amp;quot;Reloading test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; kill `cat /tmp/service1.exe.lock`&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;        ;;&lt;br /&gt;*) log_action_msg &amp;quot;Usage: /etc/init.d/azservice {start|stop|restart|reload|force-reload}&amp;quot;&lt;br /&gt;        exit 2&lt;br /&gt;        ;;&lt;br /&gt;esac&lt;br /&gt;exit 0&lt;/code&gt;&lt;p&gt;Dipendentemente dall'opzione passata (start, stop, restart, reload, force-reload), viene invocato in comando &lt;em&gt;mono-service2&lt;/em&gt; con le opzioni necessarie per avviare, fermare o riavviare il servizio:&lt;/p&gt;&lt;code&gt;sudo /etc/init.d/azservice start&lt;br /&gt;sudo /etc/init.d/azservice stop&lt;/code&gt;&lt;p&gt;Per essere richiamato con il precedente modo dobbiamo aggiungere a questo file il flag &amp;quot;avviabile&amp;quot;:&lt;/p&gt;&lt;code&gt;sudo chmod +x  /etc/init.d/azservice&lt;/code&gt;&lt;p&gt;Trovo interessante il modo utilizzato per fermare un servizio. Prendendo la linea di codice utilizzata si può notare una strana sintassi per chi non è avvezzo a Linux:&lt;/p&gt;&lt;code&gt;kill `cat /tmp/service1.exe.lock`&lt;/code&gt;&lt;p&gt;&lt;em&gt;cat /tmp/service1.exe.lock&lt;/em&gt; visualizza normalmente a video il contenuto del file (in questo caso il numero di processo del servizio). Racchiuso tra quegli apici, prende l'output del comando e lo invia a &lt;em&gt;kill&lt;/em&gt; che fermerà il processo del servizio.&lt;/p&gt;&lt;p&gt;Per completare il tutto dobbiamo inviare un ultimo comando. Linux ha vari &lt;em&gt;level&lt;/em&gt; di avvio. Ognuno di essi si contraddistingue per l'avvio di &lt;em&gt;n&lt;/em&gt; servizi. Maggiori informazioni a riguardo si possono trovare &lt;a title="Link esterno" href="http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html"&gt;qui&lt;/a&gt;. Per fare in modo che il nostro servizio sia collegato a questi &lt;em&gt;level&lt;/em&gt;, dobbiamo scrivere il comando:&lt;/p&gt;&lt;code&gt;sudo update-rc.d azservice defaults&lt;/code&gt;&lt;p&gt;Dove &lt;em&gt;azservice&lt;/em&gt; è il nome del file che abbiamo creato in &lt;em&gt;/etc/init.d/&lt;/em&gt;. Il nostro lavoro è finito. Ad ogni avvio il servizio verrà richiamato. Un piccolo avvertimento: questo servizio ha normalmente accesso a tutti i file e un'operazione sbagliata può creare danni irreversibili sulla macchina (ipottizzando che debba cancellare dei file presenti in una directory, un comando come rm -rf * può avere effetti indesiderati se richiamata nella directory root della macchina ;)).&lt;/p&gt;&lt;p&gt;Ubuntu presenta un tool &amp;quot;Servizi&amp;quot; che permette la gestione dei servizi sulla macchina. Si può notare come quello appena creato non sia presente nella lista. Non volendo investigare oltre per scoprire il perché, ho utilizzato di un altro strumento più potente, &amp;quot;BUM&amp;quot; (Boot-up manager) installabile dai repository, in grado di gestire anche quello che ho appena creato, come si vede in figura:&lt;/p&gt;&lt;p&gt;&lt;img alt="boot-up manager" hspace="0" src="http://blogs.aspitalia.com/img/andrewz/Immagini/bum.png" align="baseline" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Nel caso di Ubuntu consiglio anche l'upgrade immediato all'ultima versione 1.9.1 di Mono. Per ottenere questo è sufficiente aggiungere il repository di Mono, come è spiegato &lt;a title="Link esterno" href="http://www.mono-project.com/Other_Downloads"&gt;qui&lt;/a&gt;, che risolve anche il bug prima citato di &lt;em&gt;mono-service2&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx"&gt;&lt;em&gt;Servizi in C# su macchine Linux con Mono&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2308.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2308</trackback:ping></item></channel></rss>
