Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

domenica 28 gennaio 2007

Una classe helper per la formattazione binaria

Nelle mie applicazioni mi capita spesso di serializzare gli oggetti in formato binario per salvarli su disco, per inviarli sulla rete, ecc... Mi sono così definito una semplice classe helper per velocizzare questo procedimento:

using System; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.IO; namespace SerializationHelper { public static class Serializator { public static void Serialize(object obj, Stream serializationStream) { try { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(serializationStream, obj); } catch (SerializationException ex) { throw new SerializationException(ex.Message + Environment.NewLine + "To make a class serializable, add the 'Serializable' attribute before the declaration of the class.", ex.InnerException); } } public static void Serialize(object obj, string path) { using(Stream fileStream = File.Open(path, FileMode.Create)) Serialize(obj, fileStream); } public static object Deserialize(Stream serializationStream) { try { BinaryFormatter formatter = new BinaryFormatter(); return formatter.Deserialize(serializationStream); } catch (SerializationException ex) { throw new SerializationException(ex.Message + Environment.NewLine + "To make a class serializable, add the 'Serializable' attribute before the declaration of the class.", ex.InnerException); } } public static object Deserialize(string path) { using(Stream fileStream = File.Open(path, FileMode.Open)) return Deserialize(fileStream); } } }

Non è niente di eccezionale, ma avere questo codice sempre a disposizione quando serve è molto comodo smile_wink.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (4) | Filed Under [ C# ]

Mouse Gestures in .NET

Chi utilizza FireFox dice di non poterne più fare a meno: se anche voi volete aggiungere le mouse gestures alle vostre applicazioni .NET, date un'occhiata a questo articolo. Il codice sorgente è disponibile sia per C# sia per Visual Basic .NET.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (5) | Filed Under [ C# VB .NET ]

La mole dei programmi moderni

Ormai siamo tutti abituati a programmi che in realtà sono suite di applicazioni... Per fare un esempio su tutti, Nero 7 Reloaded comprende ben 19 applicazioni: Nero Home, Nero Mobile, Nero Scout, Nero StartSmart, Nero Burning ROM 7, Nero Express 7, Nero WaveEditor 3, Nero SoundTrax 2, Nero Vision 4, Nero ShowTime 3, Nero Recode 2, Nero MediaHome, Nero PhotoSnap, Nero CoverDesigner, Nero Toolkit, Nero BackItUp 2, InCD 5, Nero SoundBox e Nero ImageDrive smile_confused.

Di fronte a pacchetti di questa mole, mi viene spontanea una domanda: ma l'utente medio sa quello che installa sul suo PC? La maggior parte delle persone, infatti, quando deve installare un programma (ho preso Nero solo come esempio), spesso opta per l'installazione completa o al massimo quella tipica, trovandosi nel sistema una serie di programmi che probabilmente non utilizzerà mai. Se il problema fosse solo questo, di per sé non sarebbe eccessivamente grave (ormai lo spazio su disco è sovrabbondante). Il problema vero si ha quando i programmi installano moduli che vengono eseguiti all'avvio, quindi rallentano la fase di caricamento e, rimanenendo costantemente in esecuzione, appesantiscono il sistema. Anche se tali programmi hanno il diritto di essere eseguiti all'avvio e rimanere in esecuzione, quello che secondo me non va è che lo facciano all'insaputa dell'utente, il quale, dopo aver installato un nuovo software, si ritrova con il computer improvvisamente più lento e non riesce a capirne il motivo...

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (20) | Filed Under [ Tutto & Oltre :-) ]

Un po' di autoironia...

Come ho già avuto modo di dire in questo blog, negli ultimi tempi mi sto occupando di riconoscimento vocale utilizzando il .NET Framework 3.0. Certo che vedere questo video:

non mi dà proprio una ventata di ottimismo smile_cry... Per foruna questa prova si basa su una beta di Windows Vista; il motore di Automatic Speech Recogniton integrato nella versione definitiva del sistema operativo è migliorato un pochetto smile_tongue 

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (1) | Filed Under [ Tutto & Oltre :-) .NET 3.0 ]

Creare filmati da un'applicazione per PocketPC

Anche per PocketPC esistono programmi che consentono di registrare quello che compare sul display, ad esempio per realizzare demo di applicazioni. In particolare, uno dei più semplici da utilizzare è VH PocketPC Capture. Questo programma è composto da un'applicazione che deve essere caricata sul PocketPC di cui si vuole catturare lo schermo e un filtro che si installa sul desktop ed aggiunge al sistema una scheda di cattura virtuale: grazie ad essa è possibile registrare ciò che appare sullo schermo utilizzando programmi come VirtualDub oppure l'applicazione di esempio disponibile nel pacchetto del download:

Perché il sistema funzioni, il palmare e il desktop devono essere collegati tramite ActiveSync. Il prodotto attualmente è in versione 0.91 beta e supporta sia PocketPC sia Smartphone con sistema operativo Windows Mobile 5.0. In entrambi i casi, l'applicazione da caricare sul dispositivo palmare occupa meno di 150 KB; attraverso la connessione con ActiveSync, il filmato viene salvato direttamente sul computer desktop, quindi il palmare non ha bisogno di memoria aggiuntiva per la registrazione. E' gratutito per l'utilizzo personale. Per maggiori informazioni e per procedere con il download, fare clic qui.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (3) | Filed Under [ .NET Compact Framework Tutto & Oltre :-) ]

Estensioni della classe ThreadPool

Quando si lavora con il multithreading, una delle prime cose da valutare è la possibilità di utilizzo della classe ThreadPool. Su MSDN Magazine sono disponibili due articoli che spiegano come estendere questo oggetto per aggiungere alcune funzionalità secondo me molto importanti: attendere la terminazione di un pool di thread (ThreadPoolWait) ed annullare l'esecuzione di uno specifico thread inserito nella coda di esecuzione (AbortableThreadPool). Entrambi questi articoli sono accompagni dal codice sorgente in linguaggio C#.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (0) | Filed Under [ C# ]

Windows Vista e il firewall integrato

Il firewall integrato in Windows Vista ha compiuto un netto passo avanti rispetto a quello presente in XP. Esso finalmente può bloccare anche le connessioni non autorizzate in uscita. Inoltre non è per nulla invasivo, soprattutto se paragonato a prodotti come ZoneAlarm: quest'ultimo, specie durante la fase iniziale di utilizzo, visualizza un gran numero di richieste di accesso alla rete da parte dei programmi installati, scoragggiando l'utente meno esperto... Spesso ho sentito dire dai miei amici: ZoneAlarm sarà potente quanto vuoi, ma ogni 30 secondi mi chiede se il programma XXX può collegarsi ad Internet... Alla fine l'ho disinstallato perché mi dava fastidio.

Per mantenere questa facilità d'uso, Microsoft ha dotato Windows Firewall di due interfacce di gestione. La prima, quella accessibile facendo doppio clic sull'icona Windows Firewall all'interno del Pannello di controllo, è lo strumento di configurazione di base, che sostanzialmente ricalca quello già presente in Windows XP, e consente di attivare/disattivare il firewall e specificare quali programmi e quali porte possono essere utilizzati per comunicare in rete. Per avere un controllo completo sul firewall, invece, è necessario eseguire il programma Windows Firewall con protezione avanzata (il modo più veloce per trovarlo è usare la funzione di ricerca del menu Start). Esso mostra le regole per le connessioni in entrata e in uscita di tutti i programmi configurati, e per ognuno consente di specificare i protocolli di rete e le porte consentite, quali utenti hanno la possibilità di accedere alla rete utilizzando tale applicazione, e molto altro ancora. Si tratta, in sostanza, delle stesse funzionalità che sono presenti nei firewall commerciali.

In conclusione, mentre con Windows XP l'utilizzo di un firewall di terze parti era quasi d'obbligo, il firewall di Windows Vista svolge egregiamente il suo compito, riducendo, se non eliminando, la necessità di installare un prodotto aggiuntivo.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ Windows Related ]

Un ringraziamento a Davide...

Questo pomeriggio mi sono imbattutto in un problema legato alle date memorizzate in un database di SQL Server 2005. Mi sono però ricordato che il mitico Davide Mauri aveva parlato di questa tematica nel suo webcast di dicembre SQL Server Developer Best Practices - Parte 1: ho così recuperato la registrazione e, seguendo i consigli forniti, in poco tempo sono venuto a capo del problema! Grazie Davide, mi hai risparmiato un bel po' di fatica smile_wink

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ ADO .NET & SQL Tutto & Oltre :-) ]

Paint.NET 3.0 versione definitiva

Con 5 giorni di anticipo rispetto alla data di rilascio prevista, lo scorso 26 gennaio è stata rilasciata la versione definitiva di Paint.NET 3.0. Queste le principali novità:

    • Simple and intuitive tab-based multi-document user interface
    • Now available in 8 languages: English, Chinese (Simplified), French, German, Japanese, Korean, Portuguese (Brazil), and Spanish
    • Interactive Gradient Tool that makes it very easy to draw and then fine-tune placement and coloring of a gradient
    • User-definable color palette (as opposed to just the color wheel)
    • New effects: Clouds, Median, Unfocus, Outline, and an improved Sharpen
    • More intuitive and more powerful toolbar
    • Generally improved and cleaner user interface
    • History files are now compressed to save disk space, reduce disk activity, and improve performance
    • "Merge Down" layer command

Inutile dire che ho già provveduto a scaricarlo ed installarlo. Il download è di poco meno di 5.5 MB. L'occupazione di memoria del programma appena avviato è di circa 27 MB. Nononstante di versione in versione vengano aggiunte sempre nuove funzionalità, Paint.NET mantiene le sue caratteristiche di semplicità e immediatezza d'uso.

Mi permetto però di fare un paio di note. Innanzi tutto, Paint.NET 3.0 non supporta più Windows 2000, dunque può essere installato solo su Windows XP/2003/Vista. Non capisco il perché di questa scelta, dal momento che il software è realizzato con il .NET Framework 2.0, il cui runtime è disponibile non solo per Windows 2000, ma anche per Windows 98. L'altro appunto riguarda la stampa delle immagini, che utilizza il wizard Stampa guidata foto di Windows: da un programma di questo livello mi sarei aspettato funzionalità di stampa un po' più evolute.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ Tutto & Oltre :-) ]

Caricamento di DLL in AppDomain diversi

Quando si deve realizzare un sistema basato su plug-in, è buona norma utilizzare un AppDomain diverso per caricare le estensioni, in modo che un plug-in mal funzionante non possa compromettere il funzionamento dell'intera applicazione. La soluzione che adotto io si basa su una classe chiamata AssemblyLoader:

1 using System; 2 using System.Reflection; 3 4 namespace System.Reflection 5 { 6 public class AssemblyLoader : MarshalByRefObject 7 { 8 public AssemblyLoader() 9 { } 10 11 public object CreateInstance(string assemblyName, 12 string interfaceName, params object[] args) 13 { 14 try 15 { 16 Assembly assembly = Assembly.LoadFrom(assemblyName); 17 foreach (Type type in assembly.GetExportedTypes()) 18 { 19 Type interfaceType = type.GetInterface(interfaceName); 20 if (interfaceType != null) 21 return Activator.CreateInstance(type, args); 22 } 23 return null; 24 } 25 catch 26 { 27 return null; 28 } 29 } 30 } 31 }

Il cuore della classe è il metodo CreateInstance, che controlla i tipi esportati da un certo assembly (riga 17), quindi crea un'istanza del tipo che implementa l'interfaccia passata come argomento (righe 19-21).

Tale classe deve essere compilata in una class library. A questo punto, per caricare un plug-in in un nuovo AppDomain è sufficiente scrivere qualcosa del tipo:

AppDomain pluginAppDomain = AppDomain.CreateDomain("Plug-in AppDomain"); AssemblyLoader loader = (AssemblyLoader)pluginAppDomain.CreateInstanceFromAndUnwrap ("AssemblyLoader.dll", typeof(AssemblyLoader).FullName); IPlugin plugin = (IPlugin) loader.CreateInstance(AppDomain.CurrentDomain.BaseDirectory + @"\Plugins\TestPlugin.dll", "IPlugin");

L'oggetto loader viene caricato nell'AppDomain chiamato Plug-in AppDomain. IPlugin è l'interfaccia che deve essere implementata da ogni plug-in; ogni plug-in, inoltre, deve estendere la classe MarshalByRefObject. Il nome dell'interfaccia deve essere passato come secondo argomento alla funzione AssemblyLoader.CreateInstance. Il risultato di questo codice è l'istanziazione della classe che implementa IPlugin (e che è contenuta in TestPlugin.dll) all'interno del nuovo AppDomain. In tal modo, richiamando sull'oggetto plugin i metodi che sono definiti nell'interfaccia IPlugin, essi verranno eseguiti all'interno del Plug-in AppDomain.

Utilizzando questa strategia, se il plug-in manifesta qualche problema è sufficiente scaricare l'AppDomain che lo contiene, senza essere costretti ad interrompere l'intera applicazione.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ C# ]

Spam sul mio blog

Temevo che prima o poi sarebbe successo... Negli ultimi tempi anche il mio blog è stato preso di mira dagli spammer. Per il momento i messaggi non sono moltissimi, quindi riesco ancora ad eliminarli, ma spero che il problema non peggiori, perché mi dispiacerebbe essere costretto a disattivare i commenti, che io ritengo una delle cose più importanti di un blog.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (1) | Filed Under [ Tutto & Oltre :-) ]

Powered by:
Powered By Subtext Powered By ASP.NET