Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1827, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

CodePlex download Scarica i miei progetti open-source su CodePlex!

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

domenica 24 luglio 2016

VS 2015 Update 3: installare un pacchetto NuGet come quick action dell'editor

Tra le varie novità introdotte da Visual Studio 2015 Update 3, la mia preferita è sicuramente la possibilità di installare un pacchetto NuGet tramite i suggerimenti del Light Bulb, quando si digita il nome di un oggetto che ancora non è definito. In buona sostanza, guardate qua:



Sto cercando di usare un oggetto, JsonConvert, che non è definito né nella BCL né in altra libreria referenziata. Quindi se uso il Light Bulb, troverò una nuova quick action che mi suggerisce di installare da NuGet la libreria Newtonsoft.Json, che in effetti è quella che definisce l'oggetto in questione. Mi basta un click per installare l'ultima versione, oppure posso scegliere di attivare la UI di NuGet. Nel primo caso, è questione di pochi secondi:



Come vedete, la libreria viene scaricata da NuGet, installata e referenziata. Inoltre viene automaticamente aggiunta la direttiva Imports (o using per C#) appropriata e l'oggetto viene riconosciuto.

Questa opzione non è abilitata per default, per farlo bisogna andare in Tools, Options, Text Editor, Basic (o C#) nel nodo Advanced selezionare la spunta per il suggerimento da NuGet:



Una grandissima comodità, sia se siete pigri come me , sia se conoscete in anticipo il nome degli oggetti da usare e volete lasciar fare il resto all'IDE.

Alessandro

posted @ domenica 24 luglio 2016 18:59 | Feedback (0) | Filed Under [ Visual Studio 2015 ]

martedì 12 luglio 2016

Xamarin.Forms e i servizi WCF

Windows Communication Foundation è una delle tecnologie su cui molti sviluppatori hanno investito, nel tempo, per offrire informazioni, dati e operazioni all'interno di reti e di architetture SOA.

Sebbene oggi si preferiscano maggiormente servizi che supportano lo standard REST, tipo Web API, WCF riveste ancora una grande importanza per due motivi: fare tutto ciò per cui Web API è meno indicato e perché, appunto, ci sono investimenti esistenti.

Chiaramente, da quest'ultimo punto di vista, può emergere la necessità di far dialogare anche un'app per dispositivo Android, iOS e Windows con un servizio WCF e, per quello che interessa noi, Xamarin e la sua parte Xamarin.Forms. Pertanto in questo post vedremo come consumare servizi WCF da Xamarin.Forms superando alcune limitazioni di progetti che difficilmente ci riguarderanno ancora.

Il problema è infatti il seguente: in Xamarin.Forms, nel progetto PCL (quello in cui condivido il codice tra le piattaforme) non esiste più la voce Add Service Reference. Devo quindi crearmi la classe proxy a manina? No, una soluzione c'è.

Creare un servizio WCF

Per questo post creeremo un semplicissimo servizio WCF che esporrà un'operazione di servizio il cui compito è quello di calcolare l'area di un cerchio. Non ci serve affatto un servizio complicato, ci serve capire i passaggi soprattutto lato client. Utilizzerò C# (...) solamente per consistency con Xamarin, ma il servizio si può scrivere senza dubbio anche in VB. Visual Studio 2015 dev'essere avviato con privilegi di amministratore, perché poi pubblicheremo il servizio su IIS locale. Non utilizzeremo IIS Express che richiede configurazioni particolari per l'emulatore Android. Creato un progetto di tipo WCF Service Application, la prima cosa è definire il contract, ossia l'interfaccia-contratto che definiremo in questo modo (rinominando quella di default):

[ServiceContract] 
public
 interface ICircleService
{    
[OperationContract]    
double CalculateCircleArea(double radius);
}

Quindi, la classe di servizio che implementa il contract, anch'essa definita rinominando la parte .svc di default:

public class CircleService : ICircleService 
{    
public
 double CalculateCircleArea(double radius)    
{        
return
 radius*radius*Math.PI;    
}
}

Posto che il progetto compila, lo pubblichiamo facendo clic destro sul progetto, Publish. Nella finestra di pubblicazione dapprima selezioniamo il profilo Custom, a cui daremo un nome, quindi inseriamo le informazioni per la pubblicazione su IIS locale:



Al termine della pubblicazione, ci accerteremo che il servizio funzioni digitando l'URL http://localhost/WcfCircleService/CircleService.svc nel browser. Nel frattempo, munitevi dell'IP della vostra macchina di sviluppo (o comunque quella su cui pubblicate il servizio). Mentre usare Localhost va bene per la pubblicazione, per la connessione al servizio ci vuole l'IP per i motivi che poi vi spiego.

Consumare servizi WCF da un'app Xamarin.Forms
Un'app per Android, iOS e Windows scritta con Xamarin.Forms può facilmente consumare un servizio WCF. C'è un però: se vogliamo sfruttare il famoso comando Add Service Reference, dobbiamo rimuovere i progetti Windows 8.1 e Windows Phone 8.1. In teoria questo non sarà un grosso danno, se stiamo creando un nuovo progetto è molto probabile che ci interessi più che altro la parte di Universal Windows Platform. Creato quindi un nuovo progetto Xamarin.Forms basato su Portable Class Library, prima di connetterci al servizio dobbiamo eseguire questa sequenza di passaggi:

  1. Rimuovere i progetti Windows 8.1 e Phone 8.1. Già solo questo farà magicamente riapparire il comando Add Service Reference (c'è una nota limitazione legata ai progetti Windows Phone)
  2. Dal progetto PCL, rimuovere il pacchetto NuGet Xamarin.Forms. Questo è necessario perché dobbiamo cambiare il target della PCL
  3. Nelle proprietà del progetto PCL, clicchiamo su Change vicino ai target supportati e cambiamoli con quelli visibili nella prossima figura (di fatto togliamo Windows Phone 8.1)
  4. Reinstalliamo il pacchetto Xamarin.Forms da NuGet.



Fatto questo, possiamo finalmente connetterci al servizio WCF mediante Add Service Reference nel progetto PCL:




Importante: nell'indirizzo del servizio, mettete l'indirizzo IP. Non localhost, né il nome della macchina perché l'emulatore Android considera se stesso come il localhost. A questo punto il più è fatto. Nella pagina principale di questa app, possiamo scrivere dello XAML molto semplice che richieda l'inserimento del raggio e attenda il risultato del calcolo a seguito della pressione di un pulsante:

  <StackLayout Orientation="Vertical">     
<
Label Text="Insert radius:"             
VerticalOptions="Center"             
HorizontalOptions
="Center" />    
<
Entry x:Name="RadiusEntry" />    
<
Button x:Name="CircleButton" Text="Go!" Clicked="CircleButton_Clicked"/>    
<
Label x:Name="ResultLabel"/>  
</
StackLayout>
Il code-behind è altrettanto semplice, si crea l'istanza della classe client e si invoca il metodo di servizio:

public partial class MainPage : ContentPage 
{    
CircleServiceClient
 client;    
public MainPage()    
{        
InitializeComponent();        
this.client = new CircleServiceClient();        
this
.client.CalculateCircleAreaCompleted += Client_CalculateCircleAreaCompleted;    
}    

private
 void Client_CalculateCircleAreaCompleted(object sender, CalculateCircleAreaCompletedEventArgs e)    
{            
this
.ResultLabel.Text = e.Result.ToString();    
}    
private
 void CircleButton_Clicked(object sender, EventArgs e)    
{            
double
 radius = double.Parse(this.RadiusEntry.Text);            
this
.client.CalculateCircleAreaAsync(radius);    
}
}

Una considerazione fondamentale: non c'è modo di cambiare la generazione del codice basato su APM (Asynchronous Programming Model), quindi anche se la nostra operazione di servizio restituisce double, la classe proxy la costringe a ritornare void per poi scatenare un evento al completamento dell'operazione, all'interno del cui gestore troveremo il risultato dell'operazione stessa. Altre operazioni di generazione del codice sono disabilitate e pertanto, almeno da quel che ho visto, ce lo dobbiamo tenere così.

I permessi

Ricordiamoci che le nostre app devono poter accedere alla rete e pertanto devono avere i relativi permessi. Un'app Android vuole la permission Internet, una UWP vuole la Internet (client) e la Private Networks se siete all'interno di una rete locale. I permessi vanno impostati nei relativi manifest.

Risultato finale
Al termine di questo lavoro, la nostra app riesce a consumare il servizio WCF in modo molto semplice:



Come detto, il servizio utilizzato è molto molto semplice. La logica di connessione e generazione della classe proxy, però, è quella anche in servizi più complessi.

Alessandro

posted @ martedì 12 luglio 2016 22:00 | Feedback (0) | Filed Under [ Xamarin ]

giovedì 7 luglio 2016

Nuovo articolo su MSDN Magazine: Xamarin Forms e l'accesso ai dati con SQLite

Con il numero di luglio 2016 di MSDN Magazine è stato pubblicato un mio nuovo articolo dal titolo "Working with local databases in Xamarin.Forms using SQLite".

L'articolo descrive come utilizzare SQLite per memorizzare dati locali nelle app cross-platform che possiamo creare per Android, iOS e Universal Windows Platform con Xamarin Forms e come SQLite sia un'ottima scelta nel caso in cui non ci servano database server o comunque dati remoti.

Con l'occasione ricordo che anche su VB T&T stiamo dedicando spazio a Xamarin, in particolare a Xamarin Forms: nell'area Video potete trovare tre video introduttivi. Ci stiamo poi attrezzando per altri contenuti.

Alessandro

posted @ giovedì 7 luglio 2016 12:00 | Feedback (0) | Filed Under [ Xamarin ]

sabato 2 luglio 2016

Visual Studio 2015 Update 3: un consiglio per il setup

Come sapete da qualche giorno è disponibile l'Update 3 per Visual Studio 2015.
Parlando in giro con un po' di persone, sembra che molti abbiano avuto problemi installandolo dall'ISO disponibile per gli abbonati MSDN e, credo, anche sul sito di VS.

Anche se non è mia abitudine, stavolta ho utilizzato il Web Installer e problemi non ne ho avuti. Idem altre persone che hanno fatto la stessa cosa. Consiglio, quindi, di installarlo con questo piccolo tool. Non sono andato ad approfondire le ragioni, non c'è tempo, ma tant'è.

Alessandro

posted @ sabato 2 luglio 2016 08:27 | Feedback (0) | Filed Under [ Visual Studio 2015 ]

venerdì 1 luglio 2016

Microsoft MVP 2016

Da qualche anno il 1° luglio per me è sempre una giornata speciale, in quanto si attende la rinomina a Microsoft MVP che, fortunatamente, anche quest'anno è arrivata nella categoria Visual Studio and Development Technologies.

So di essere ripetitivo, ma per me è sempre un grande onore e una grande emozione far parte di questo gruppo di professionisti che nel globo si contraddistinguono non solo per le loro capacità, ma anche per la loro umanità, amicizia e spirito di community.

La community è fatta dalle persone e queste sono il vero benefit del programma MVP. Il primo award arrivò l'1 luglio 2008 per Visual Basic (e per alcuni anni a seguire), nel frattempo il mondo dello sviluppo su tecnologie Microsoft è cambiato molto e di riflesso sono cambiati tanti contenuti di cui mi sono occupato, spesso scrivendo nella lingua d'oltre oceano, ma spero che la passione che ci metto continui ad essere trasparente e che anche gli argomenti nuovi risultino utili.

Un ringraziamento a Microsoft, per la rinnovata fiducia, a tutti gli MVP per l'amicizia ma soprattutto un abbraccio ad Alessandro Teglia e Marjorie per tutto quello che hanno fatto in questi anni per noi.

Alessandro

posted @ venerdì 1 luglio 2016 18:45 | Feedback (0) | Filed Under [ Community and friends ]

giovedì 30 giugno 2016

Xamarin Forms, MVVM e il refresh dei command

Per questo post prendo spunto da una domanda ricevuta durante un corso che ho appena tenuto su Xamarin Forms, fornendo una soluzione che abbiamo recuperato tramite Internet ma che merita qualche approfondimento.

Se anche voi provenite da WPF e siete abituati ad utilizzare il pattern Model-View-ViewModel, sapete che la classe RelayCommand implementa l'interfaccia ICommand, che obbliga la classe ad avere, tra gli altri, un metodo CanExecute. Questo serve a dire agli oggetti in binding se un comando può essere eseguito oppure no.

Se ad esempio un pulsante è in binding con un comando e CanExecute è False, il pulsante risulta disabilitato. In WPF esiste la classe CommandManager e il suo metodo RequerySuggested, che consentono a RelayCommand di aggiornare manualmente lo stato di CanExecute. Essi però fanno parte dell'assembly PresentationCore che, ovviamente, in Xamarin non è disponibile.

In Xamarin Forms, però, esiste una classe Command che, oltre ad implementare ICommand, ha una struttura leggermente diversa e che può fare al caso. Per ottenere il risultato, in buona sostanza, si può riscrivere RelayCommand ereditando da Command invece che implementare ICommand e mettersi in ascolto di eventi PropertyChanged, al verificarsi dei quali verrà chiamato manualmente un delegate che si chiama ChangeCanExecute e che si occuperà di aggiornare, per l'appunto, lo stato di CanExecute.

Tradotto in codice:

    public class RelayCommand : Command
    {
        
public RelayCommand(Action<object> execute)
            : 
base(execute)
        {
        }

        
public RelayCommand(Action execute)
            : 
this(o => execute())
        {
        }

        
public RelayCommand(Action<object> execute, Func<objectbool> canExecute, INotifyPropertyChanged npc = null)
            : 
base(execute, canExecute)
        {
            
if (npc != null)
                npc.PropertyChanged += 
delegate { ChangeCanExecute(); };
        }

        
public RelayCommand(Action execute, Func<bool> canExecute, INotifyPropertyChanged npc = null)
            : 
this(o => execute(), o => canExecute(), npc)
        {
        }
    }

Fonte qui.

Alessandro

posted @ giovedì 30 giugno 2016 17:29 | Feedback (0) | Filed Under [ Xamarin ]

lunedì 27 giugno 2016

Microsoft rilascia .NET Core 1.0 e Visual Studio 2015 Update 3

Oggi è un giorno epocale, esattamente come lo fu quello in cui venne rilasciato .NET Framework 1.0 per la prima volta tanti anni or sono.

Microsoft ha infatti rilasciato .NET Core 1.0, la RTM del runtime open source, modulare e cross-platform che consente di sviluppare applicazioni per Windows, Mac e Linux.

Unitamente a questo, è stato anche rilasciato Visual Studio 2015 Update 3 che contiene una nutrita serie di bug fix e di miglioramenti alle performance.

Per quanto riguarda .NET Core, segnalo un interessantissimo articolo in italiano di Cristian Civera, che con la sua consueta chiarezza vi spiega meglio di che si tratta.

Per quanto riguarda Visual Studio 2015 Update 3, qui ci sono tutti i dettagli.

Ci vorrà probabilmente un po' di tempo, ma da oggi il mondo dello sviluppo comincerà ad essere diverso.

Alessandro

posted @ lunedì 27 giugno 2016 19:18 | Feedback (0) | Filed Under [ Visual Studio 2015 .NET Compiler Platform (Roslyn) Windows 10 ]

domenica 26 giugno 2016

Xamarin: risolvere l'errore "Build action EmbeddedResource is not supported"

Un altro problema piuttosto fastidioso che può capitarvi con Xamarin è legato soprattutto a parecchi esempi di codice che potete scaricare dal Web, inclusi (anzi, per primi) quelli nel repo ufficiale su GitHub.

In buona sostanza succede questo: aprite la solution, la compilate ma la build fallisce col seguente errore "Build action 'EmbeddedResource' is not supported by one ore more of the project's target", che tipicamente si verifica nel progetto Android.

Per risolverlo, innanzitutto non ignoriamo gli warning nella Error List Se troviamo un messaggio con codice IDE0006, espandiamolo: ci verrà praticamente detto cosa fare.

In sintesi:

  1. Per tutti i progetti nella solution, espandiamo il nodo References e verifichiamo che non ci siano problemi su qualche riferimento. Nel caso ci siano, semplicemente clicchiamo l'elemento. Questo, per qualche ragione, farà si che i riferimenti si aggiornino.
  2. Chiudiamo Visual Studio e apriamo un prompt dei comandi.
  3. Digitiamo la seguente riga: SET TRACEDESIGNTIME=TRUE per impostare questa variabile d'ambiente che serve ad avere un log di eventuali problemi
  4. Nella cartella della solution, eliminiamo la sottocartella chiamata .vs ed eventualmente il file .suo
  5. Riavviamo Visual Studio, riapriamo la solution e riproviamo a compilare.

Se ancora non dovesse andare a buon fine, nella cartella C:\Users\NomeUtente\AppData\Local\Temp cerchiamo una sottocartella che riporta il nome del progetto Android (quindi .Droid) e verifichiamo eventuali log che ci daranno le informazioni sul reale problema verificatosi.

Alessandro

posted @ domenica 26 giugno 2016 17:01 | Feedback (0) | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET