Installazione di Visual Studio 2012

Dato che la prossima settimana (il 12 settembre per la precisione) ci sarà l’evento di lancio di Visual Studio 2012 presso la sede di Microsoft (a cui partecipa anche DotDotNet) ho pensato che fosse l’ora di installarlo per cominciare ad utilizzarlo.

Intanto le prime considerazioni sull’installazione side-by-side.

Ogni release di Visual Studio è sempre accompagnata da una release del framework ed in particolare Visual Studio 2012 installa anche il .NET Framework 4.5.
Sia VS 2012 che il Framework 4.5 funzionano perfettamente side-by-side con tutte le precedenti versioni.

Normalmente quando si apre una soluzione creata con una vecchia versione di VS con una versione più recente viene aggiornato il file sln. Questo resta vero anche in questo caso con un solo distinguo: se la soluzione è stata creata con VS 2010 SP1 allora la soluzione resta accessibile anche da VS 2010 SP1. In particolare viene solo modificato il file format:

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012

Questo resta valido finché non si utilizzano le feature specifiche di VS 2012 come ad esempio targettizzare un progetto al Framework 4.5 il che rende inaccessibile il file sln da Visual Studio 2010 SP1.

Alcuni tipi di progetto non sono più supportati in Visual Studio 2012. In questa pagina si possono vedere quali progetti sono completamente gestiti e quali no: Visual Studio 2012 compatibility.

Dopo un breve download dall’MSDN della versione Premium, circa 15 minuti per una ISO di 1,5GB, lancio l’installazione che richiede solo due interventi: l’accettazione della licenza e la selezione delle feature da installare:

Visual Studio 2012 setup - license agreement02 - Feature selection

A questo punto l’installazione richiede alcuni minuti, un riavvio e la conferma finale:

03 - Installing04 - Restart required05 - Visual Studio 2012 Setup complete

Alla prima esecuzione è possibile importare le impostazioni di una precedente versione di Visual Studio, selezionare come al solito la configurazione di sviluppo preferita (per me come sempre Web Development) e la quantità di documentazione da installare localmente:

06 - Visual Studio 2012 first run

Fine. Nel giro di 30’ minuti è possibile vedere il nuovo layout di Visual Studio 2012:

08 - Visual Studio 2012 layout09 - Visual Studio 2010 layout

Devo dire che il primo colpo d’occhio è notevolmente piacevole e pratico. Rispetto alla versione 2010 ci sono pochi colori, poche distrazioni, una grafica lineare e molto pulita.

Share

Usare il metodo Find di Entity Framework con le chiavi composte

Il metodo Find di Entity Framework 4.3 consente di recuperare un entità dal contesto in base alla chiave primaria.

Se l’entità è già presente nel contesto viene immediatamente restituita senza nessun round-trip al server in caso contrario viene effettuata una query di SELECT sul database.

L’oggetto recuperato viene collegato al contesto. Se l’oggetto non è presente nel contesto o nel database il metodo Find restituisce null.

Ad esempio:

_dbContext.Products.Find(1);

restituisce il prodotto con chiave 1 (int)

Supponiamo adesso di avere un prodotto con chiave primaria composta (composite key):

public class Product
    {
        public string StyleCode { get; set; }
        public string MaterialCode { get; set; }
        public string ColorCode { get; set; }
    }

Il mapping sarà di questo tipo:

public ProductMap()
        {
            HasKey(product => new { product.StyleCode,
                                       product.MaterialCode,
                                       product.ColorCode });
        }

Inseriamo nel db un prodotto in questo modo:

_dbContext.Products.AddOrUpdate(p => 
new { p.MaterialCode, p.StyleCode, p.ColorCode },
                                     new Product
                                         {
                                             StyleCode = "1",
                                             MaterialCode = "2",
                                             ColorCode = "3"
                                         });

 

ed invochiamo il metodo Find in questo modo:

_dbContext.Products.Find(1, 2, 3);

Molto probabilmente il risultato sarà null.

Questo perchè la firma del metodo Find è Find(params object[] keyValues) e quindi Entity Framework a questo punto non è ancora in grado di mappare i valori della chiave nell’ordine corretto.

Il mapping della classe Product va quindi modificato utilizzando il metodo HasColumnOrder:

public ProductMap()
        {
            HasKey(product => new { product.StyleCode, 
                                       product.MaterialCode,
                                       product.ColorCode });
            Property(p => p.StyleCode).HasColumnOrder(0);
            Property(p => p.MaterialCode).HasColumnOrder(1);
            Property(p => p.ColorCode).HasColumnOrder(2);
        }

In questo modo i parametri della chiave primaria vengono mappati in ordine.

Share

Gestire le virtual directory con IIS Express

Uno degli aspetti principali di IIS Express è la sua flessibilità e configurabilità al pari di IIS “completo”, e ben superiori a Cassini.

Una delle necessità più frequenti è quella di configurare una virtual directory (si pensi ad esempio ad una cartella images posizionata al di fuori del web site).

Per configurare le virtual directory in IIS Express è sufficiente modificare il file applicationhost.config che si trova nella cartella Users/<username>/IISExpress/Config.

All’interno della sezione sites individuare il sito in cui si vuole gestire la virtual directory e aggiungere una nuova application.

Ad esempio:

<site name="WebSiteWithVirtualDirectory" id="1">
  <application path="/" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="c:tempwebsite1" />
  </application>
  <application path="/Images" applicationPool="Clr4IntegratedAppPool">
    <virtualDirectory path="/" physicalPath="d:tempImages" />
  </application>
  <bindings>
    <binding protocol="http" bindingInformation="*:1132:localhost" />
  </bindings>
</site>

configura un sito su IIS Express in questo modo:

localhost:1132 -> punta alla cartella c:tempwebsite1

localhost:1132/Images -> punta alla cartella d:tempimages

Da notare che è possibile configurare sito e virtual directory in maniera completamente autonoma, ad esempio impostando diversi application pool.

Share

RequestValidation e RequestValidationMode in ASP.NET 4.0

Dalla versione 2.0 di Asp.Net a default è impossibile inserire del testo html nelle textbox per motivi di sicurezza, in particolare per evitare la script injection.

Cercando di inserire dei tag html in una form si ottiene un’eccezione di questo tipo:

A potentially dangerous Request.Form value was detected from the client

Tipicamente questo comportamento viene disabilitato in alcune aree del backoffice delle web application proprio per consentire l’inserimento di testo Html come ad esempio la descrizione estesa dei prodotti in un sito di commercio elettronico.

Per disabilitare la validazione è sufficiente impostare ValidateRequest a false all’interno della direttiva page.

Fin qui tutto normale.

Però migrando un progetto al framework 4.0 la validazione scatta nuovamente e si ottiene nuovamente lo YSOD.

Il problema si presenta in quanto la pipeline di validazione è stata modificata. Per ottenere nuovamente il comportamento del framework 2.0 è sufficiente settare il parametro requestValidationMode nel web.config:

<httpRuntime requestValidationMode=”2.0″ />

Ogni valore inferiore a 4.0 viene interpretato come 2.0.

Maggiori informazioni sul sito MSDN:

HttpRuntimeSection.RequestValidationMode Property

Share

Spostare la cartella packages di NuGet

Nella configurazione di default NuGet crea una cartella chiamata packages nella root della soluzione dove vengono copiati tutti i package installati.

Questa configurazione non corrisponde però alla struttura delle mie soluzioni che normalmente è:

  • lib
  • src

dove lib contiene tutte le librerie da cui dipendono i progetti mentre i sorgenti della soluzione si trovano in src.

Fortunatamente esiste una feature non documentata che consente di specificare la posizione dei packages. E’ sufficiente aggiungere il file nuget.config allo stesso livello del file .sln e configurare il parametro repositoryPath.

Ad esempio per supportare la configurazione lib – src creare il file nuget.config in questo modo:

<settings>
	<repositoryPath>../lib/packages/</repositoryPath>
</settings>

NB: il path non può essere assoluto ma deve essere relativo rispetto al file .sln

In questo modo sia il package manager che la package console funzioneranno perfettamente utilizzando il nuovo percorso. Ovviamente i package già scaricati dovranno la prima volta essere spostati a mano nella nuova cartella.

Importante: lo stesso Phil Haack precisa che la feature non è supportata e non documentata perchè presenta ancora alcuni problemi e potrebbe essere rimossa/modificata nelle future release di NuGet.

Share

Gestire le librerie con NuGet. Package reference e Package Console

Nel precedente post ho fatto una breve introduzione a NuGet e alla sua installazione in Visual Studio 2010.

In questo post entro invece più in dettaglio sulla gestione dei package e su cosa avviene dietro le quinte.

La gestione dei package con NuGet

Per prima cosa per utilizzare tutti i comandi di NuGet è necessario che sia aperta una soluzione.

Nell’esempio ho creato una web application con nome NuGetTest.

A questo punto per installare, modificare o eliminare un package è possibile:

  • Utilizzare il menù contestuale “Add library package reference” nel progetto
  • Utilizzare la console “Package Manager Console” PowerShell

Gestire i package dalla finestra Add library package reference

La finestra “Add library package reference” è accessibile dal menù contestuale di ogni progetto.

Il suo contenuto e funzionamento è simile all’Extension manager di Visual Studio.

E’ possibile:

  • Cercare un package online
  • Installare un package
  • Visualizzare i package installati
  • Aggiornare un package a una nuova versione
  • Rimuovere un package installato

Vediamo alcuni esempi concreti.

Esempio: aggiungere log4net tramite il library package reference

add library package reference

Nell’esempio ho scelto log4net

Add library package reference window

Premendo “Install” viene scaricato ed installato il package. Il risultato è il seguente:

    1. Viene creata una cartella packages nella root della soluzione
    2. Viene aggiunta una reference alla DLL

log4net reference

  1. Viene creato il file Packages.config nella root dell’applicazione

Packages.config

Dato che tutta la configurazione dei package installati è su file system all’interno della soluzione si ha immediatamente il vantaggio che è condivisa all’interno del sistema di versionamento (TFS, Subversion o Git ad esempio).

Rimuovere e aggiornare i package dalla finestra Library Package Reference

Dalla finestra Library Package Reference è possibile anche disinstallare un package oppure aggiornarlo a una nuova versione.

Ad esempio per rimuovere log4net è sufficiente visualizzare tutti i package installati e premere uninstall.

uninstall-log4net-from-library-package-reference

Anche l’aggiornamento di un package si fa con un paio di click. Si seleziona Updates e se sono disponibili degli aggiornamenti per un package installato è sufficiente premere Update.

Nell’esempio è stato installato il package NHibernate in versione beta. Nell’elenco degli updates compare la versione definitiva di NHibernate 3.

update-nhibernate-from-library-package-reference

L’aggiornamento provvede automaticamente a rimuovere la vecchia libreria e a referenziare la nuova.

Gestire i package tramite la Package Manager Console

La package manager console è lo strumento più potente e flessibile per gestire i package.

Da riga di comando è possibile ad esempio scegliere la versione da installare oppure disinstallare un package forzando o no la rimozione dei package da cui dipende (solo se non utilizzati da altri package).

Digitando il comando

get-help about_NuGet

viene mostrato l’elenco dei comandi disponibili.

La guida completa è anche online su CodePlex a questo indirizzo:

http://nuget.codeplex.com/documentation?title=Package%20Manager%20Console%20Command%20Reference

Esempio: aggiungere NHibernate tramite la Package Console

Digitare il comando get-package. Viene visualizzato l’elenco dei package attualmente installati:

get-package log4net

Il comando get-package –remote visualizza l’elenco dei package disponibili nel feed corrente (ricordo che di default si tratta del NuGet official package source).

Al momento in cui scrivo si ottiene una lista di circa 1000 package. E’ possibile filtrare la lista con l’opzione filter.

Ad esempio con il comando

get-package –remote –filter nhibernate

si ottiene la lista di tutti i package con nhibernate nel nome o nella descrizione:

get-package filter nhibernate

A questo punto per installare il package NHibernate eseguire il comando:

install-package NHibernate

NB: il progetto in cui viene installato il package è quello selezionato nel menù a tendina “Default Project” nella console.

install-package nhibernate

In questo caso va notato che il package di NHibernate ha 3 dipendenze:

  • Iesi.Collections
  • Antlr
  • Castle.Core

e per ogni dipendenza è specificata la versione minima necessaria.

NuGet si accorge che le dipendenze non sono ancora installate e provvede automaticamente a scaricarle, installarle e configurarle.

A questo punto nella soluzione sono state aggiunte le nuove reference:

nhibernate reference

Viene inoltre aggiornato il file packages.config e la cartella packages nella root della soluzione:

Packages.config nhibernate

packages folder nhibernate

Esempio: installare ELMAH

Eseguire adesso il comando

install-package elmah

In questo caso oltre alla solita configurazione delle reference è necessario modificare il web.config.

NuGet aggiunge in automatico una nuova configSection nel web.config

elmah configsections

e configura i necessari httpmodules e httphandler:

elmah httpmodule httphandler

Da notare che la configurazione è stata fatta correttamente sia per IIS 6 che per IIS 7.

Esempio: disinstallare ELMAH

Per disinstallare un package è sufficiente eseguire il comando:

uninistall-package

Ad esempio il comando uninstall-package ELMAH esegue in automatico questi passi:

–          Rimuove la reference dal progetto

–          Ripulisce il file web.config

–          Rimuove l’entry dal file di configurazione package.config

–          Rimuove la libreria dalla cartella packages

Aggiornare un package dalla Package Console

L’aggiornamento di un package dalla Package Console avviene con il comando:

update-package nomepackage

Ad esempio installando NHibernate in versione beta ed eseguendo il comando

update-package nhibernate

viene rimossa completamente la vecchia versione ed installata la nuova.

update-nhibernate-from-package-console

Riferimenti

CodePlex: http://nuget.codeplex.com/

Elenco dei comandi da console:
http://nuget.codeplex.com/documentation?title=Package%20Manager%20Console%20Command%20Reference

Phil Haack blog: http://haacked.com/tags/NuGet/default.aspx

Share

NuGet semplifica le gestione delle librerie nei progetti .Net

Il processo di integrazione di una libreria di terze parti (in particolare open source) in un progetto .Net richiede normalmente i seguenti passi:

  • download della libreria
  • copia dei file nella cartella della soluzione
  • aggiunta delle Reference all’interno del/dei progetti che la utilizzano
  • eventuale modifica del file web.config e app.config

Inoltre eventuali aggiornamenti di versione o rimozione di una libreria devono essere effettuati manualmente dallo sviluppatore con la solita perdita di tempo e la possibilità di commettere errori.

NuGet è la risposta per automatizzare la gestione delle librerie di terze parti all’interno di Visual Studio.

Cos’è NuGet

logo-nuget

NuGet è una libreria open source indirizzata agli sviluppatori .Net.

NuGet semplifica l’integrazione di librerie di terze parti nei progetti Visual Studio scaricando tutte le librerie necessarie, aggiungendo le reference al progetto e modificando i file web.config o app.config.

Tramite NuGet è inoltre possibile modificare e rimuovere i pacchetti installati: il processo di disinstallazione provvede a cancellare i file, rimuovere le reference e ripulire i file app.config e web.config.

NuGet si basa su package che contengono le librerie necessarie ed un file di manifest  che guida NuGet nell’installazione e manutenzione del package. I package hanno estensione .nupkg e l’elenco dei package è aggiornato tramite un feed che viene letto da Visual Studio.

I file .nupkg sono dei normali file zip.

Requisiti di sistema

NuGet richiede uno dei seguenti sistemi operativi:

  • Windows 7
  • Windows Vista SP1
  • Windows Server 2008 o R2
  • Windows Server 2003 SP2
  • Windows XP SP3

NuGet si integra con Visual Studio 2010 e Visual Web Developer 2010.

Installare NuGet

NuGet può essere installato in due modi:

  • Scaricandolo da CodePlex
  • Utilizzando l’Extension Manager di Visual Studio 2010

Download di NuGet da CodePlex

Alla pagina http://nuget.codeplex.com/releases è possibile scaricare l’estensione per Visual Studio in formato vsix.

Installazione tramite extension manager di Visual Studio 2010

Il modo sicuramente più semplice per installare e mantenere aggiornato NuGet è quello di utilizzare l’extension manager.

L’extension manager si trova nel menù Tools:

Visual-Studio-Extension-Manager-menu

L’extension manager consente di gestire tutte le estensioni di Visual Studio 2010 e di installarne di nuove.

Visual-Studio-Extension-Manager

E’ sufficiente cercare NuGet e premere Download.

Al termine dell’installazione è necessario riavviare Visual Studio.

L’integrazione con Visual Studio

L’utilizzo di NuGet può avvenire in due modi:

  • dalla finestra “Add Library Package Reference
  • sfruttando PowerShell in una finestra dedicata

L’installazione aggiunge nel menù Tools una nuova voce “Library Package Manager”.

Library-Package-Manager-menu

Package Manager Settings

Selezionando la voce “Package Manager Settings” si accede direttamente a una nuova sezione di opzioni.

Package-Sources

In Package sources si gestisce l’elenco dei feed che contengono i package in formato .nupkg.

Di default è utilizzato il feed ufficiale Microsoft.

Package Manager Console

Selezionando la voce Package Manager Console si lancia un processo PowerShell ospitato in una finestra Visual Studio.

Package-manager-console

La prima tendina consente di selezionare il feed da cui scaricare l’elenco dei package disponibili.

La seconda tendina consente invece di selezionare il progetto della soluzione corrente su cui si vogliono gestire i package.

 

Nel prossimo post vedremo come gestire i package sia dalla Library Reference sia dalla Package Console.

 

Riferimenti

Share

Completata l’agenda della sessione ASP.Net 4 e IE9

CommunitTour2010Ho completato l’agenda della sessione che terrò martedi 16 novembre nell’ambito del Community Tour organizzato dalle community DotDotNet e SharePointCommunity.

Powerful ASP.Net 4.0

  • Core services
    • Web.config File Refactoring
    • Auto-Start Web Applications
    • Permanently Redirecting a Page
    • Shrinking Session State
  • AJAX
    • jQuery out of the box
    • Content Delivery Network Support
    • ScriptManager Explicit Scripts
  • Web forms
    • Meta Tags con Page.MetaKeywords e Page.MetaDescription
    • ViewState e ViewStateMode
    • Routing in ASP.NET 4
    • Gestire i Client ID
    • Persisting Row Selection nei Data Controls
    • ASP.NET Chart Control
    • Html Encoded Code Expressions
    • CSS e rendering improvements
      • div Elements e Hidden Fields
      • Rendering delle tabelle per i controlli template
      • ListView Control Enhancements
      • CheckBoxList e RadioButtonList Control Enhancements
      • Menu Control Improvements
  • Visual Studio 2010 Web Development Improvements
    • HTML e JavaScript Snippets
    • JavaScript IntelliSense
  • Web Application Deployment
    • Web.config Transformation

Internet Explorer 9

  • HTML 5
    • Canvas
    • Audio
    • Video
    • Semantic tags
    • Client side storage
  • Accelerazione tramite GPU
  • Pinned sites
  • Developer Tools (aka F12)

Iscrizioni

Ricordando quali sono i temi trattati:

  • Sviluppo di Windows Phone 7
  • Migliorare la User Interface
  • Conoscere le novità di ASP.NET 4.0 e Internet Explorer 9
  • Il framework di sviluppo di SharePoint 2010
  • Sviluppare applicazioni silverlight per SharePoint 2010

rinnovo l’invito a partecipare all’evento. Per maggiori informazioni ed iscrizioni: http://dotdotnet.org/content/Tour2010Nov.aspx

Share

log4net, il Framework .Net 4.0 e il Client Profile

Questa settimana un cliente mi ha segnalato un problema relativo all’utilizzo di log4net con Visual Studio 2010 e il Framework 4.0.

In pratica creando un’app

licazione console e referenziando log4net in versione 1.2.10 in fase di build si riceve questo errore:

“The referenced assembly “log4net” could not be resolved because it has a dependency on “System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” which is not in the currently targeted framework “.NETFramework,Version=v4.0,Profile=Client”. Please remove references to assemblies not in the targeted framework or consider retargeting your project.”

Come esplicitato d

al messaggio il problema risiede nel fatto che la console application targettizza il Framework 4 Client Profile.

Framework-Client-Profile

Il Client Profile è il target predefinito per i nuovi progetti Windows Forms, Console Application, WPF e Window Service. L’idea di base del Client Profile è quella di ridurre le dimensioni del Framework .Net rimuovendo tutte le assembly che in certi progetti non servono.
Nello specifico il client profile non contiene:

  • ASP.NET
  • alcune funzionalità avanzate di Windows Communication Foundation (WCF)
  • il .NET Framework Data Provider per Oracle
  • MSBuild
log4net utilizza l’assembly System.Web tramite l’AspNetTraceAppender e quindi non è possibile compilare i progetti che targettizzano il Framework 4 Client Profile.
La soluzione più rapida è quella di modificare le proprietà del progetto selezionando come target framework “.Net Framework 4”.
La domanda a questo punto però è: “E’ corretto scegliere come target il framework in versione full?”
Se la risposta fosse solo nelle dimensioni direi che si potrebbe utilizzare direttamente la versione full.
Queste sono le dimensioni del framework 4 come riportato sul blog di Scott Hanselman:
3.5 SP1 4.0 RTM
32 bit Client Profile Online: 28 MB
Offline: 255MB
28.8 MB
32 + 64 bit Client Profile N/A 41 MB
32 bit Full N/A 35.3 MB
32 + 64 bit Full N/A 48.1 MB
32 + ia64 bit Full N/A 51.7 MB
32 + 64 + ia64 bit Full 231 MB N/A

In pratica la differenza di dimensioni si attesta sui 7 mega quindi secondo me non sostanziale.

L’accento probabilmente va posto su due punti:

  • concettualmente gli applicativi desktop è corretto che non abbiano riferimenti ad assembly relative al mondo web
  • il Framework 4 Client Profile è il framework che viene distribuito sui desktop tramite Windows Update
In base a questi punti direi che si può targettizzare il framework full in ambienti ben controllati o enterprise e preferire il Client Profile per tutti gli applicativi desktop.
Per quanto riguarda log4net nello specifico nelle versioni future potrebbe essere rilasciata una build compatibile col client profile senza riferimenti a System.Web altrimenti è necessario ricompilarlo rimuovendo l’AspNetTraceAppender.
Riferimenti:

.NET Framework Client Profile
Towards a Smaller .NET 4 – Details on the Client Profile and Downloading .NET
What’s new in .NET Framework 4 Client Profile RTM

Share

Come visualizzare i messagi di errore del framework in inglese

Dopo aver installato e configurato una nuova macchina per lo sviluppo con Windows 7 Ultimate (rigorosamente tutto in inglese), mi metto a far modifiche su un sito e ricevo le eccezioni in italiano.

Il problema è legato ai language pack di Windows 7 che probabilmente nel mio caso sono stati aggiunti in automatico durante un’installazione di SQL Server multilanguage.

Per visualizzare correttamente tutti i messaggi del Framework .Net in inglese è sufficiente andare nel pannello di controllo ->  (oppure usare il comando LPKSETUP)

Pannello di controllo - Lingue

e rimuovere tutte le lingue inutilizzate (io ho lasciato solo l’inglese).

Pannello di controllo - Rimozione lingue

Share