Integrazione di Visual Studio (MSBuild)
Visual Studio 2005 ospita MSBuild per caricare e compilare progetti gestiti. Poiché MSBuild è responsabile del progetto, in Visual Studio è possibile utilizzare efficacemente praticamente qualsiasi progetto nel formato di MSBuild, anche se il progetto è stato creato da uno strumento diverso e presenta un processo di compilazione personalizzato.
In questo argomento vengono descritti aspetti specifici dell'hosting di MSBuild in Visual Studio, da considerare quando si personalizzano progetti e file .TARGETS che si desidera caricare e compilare in Visual Studio. Queste considerazioni consentono di assicurarsi che funzionalità di Visual Studio come IntelliSense e il debug funzionino con un progetto personalizzato.
Estensioni del nome di file del progetto
MSBuild.exe riconosce qualsiasi estensione del nome di file del progetto che corrisponde al modello .*proj. Visual Studio riconosce tuttavia solo un sottoinsieme di queste estensioni di file di progetto, che determinano il sistema di progetto specifico del linguaggio che caricherà il progetto. In Visual Studio non è disponibile un sistema di progetto basato su MSBuild indipendente dal linguaggio.
Il sistema di progetto Visual C# carica, ad esempio, i file con estensione csproj, mentre Visual Studio non è in grado di caricare un file con estensione xxproj. Un file di progetto per file di origine in un linguaggio arbitrario deve utilizzare la stessa estensione dei file di progetto di Visual Basic o Visual C# per poter essere caricato in Visual Studio.
Nomi di destinazione noti
Scegliendo il comando Compila in Visual Studio verrà eseguita la destinazione predefinita del progetto. Spesso tale destinazione viene anche denominata Build. Scegliendo il comando Ricompila o Pulisci verrà effettuato un tentativo di eseguire una destinazione dello stesso nome nel progetto. Scegliendo Pubblica verrà eseguita una destinazione denominata PublishOnly nel progetto.
Configurazioni e piattaforme
Le configurazioni sono rappresentate nei progetti di MSBuild da proprietà raggruppate in un elemento PropertyGroup che contiene un attributo Condition. In Visual Studio vengono analizzate queste condizioni per creare un elenco di configurazioni di progetto e piattaforme da visualizzare. Per estrarre correttamente tale elenco, le condizioni devono avere un formato simile a quello riportato di seguito:
Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' "
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "
A tale scopo, in Visual Studio vengono analizzate le condizioni negli elementi PropertyGroup, ItemGroup, Import, Property e Item.
Operazioni di compilazione aggiuntive
Visual Studio consente di modificare il nome del tipo di elemento di un file in un progetto mediante la proprietà Build Action della finestra Proprietà dei file. I nomi dei tipi di elementi Compile, EmbeddedResource, Content e None sono sempre elencati in questo menu, insieme a tutti gli altri nomi di tipi di elementi già presenti nel progetto. Per accertarsi che tutti i nomi dei tipi di elementi personalizzati siano sempre disponibili in questo menu, è possibile aggiungerli a un tipo di elemento denominato AvailableItemName. Ad esempio, aggiungendo il codice riportato di seguito al file di progetto verrà aggiunto il tipo personalizzato JScript a questo menu per tutti i progetti che lo importano:
<ItemGroup>
<AvailableItemName Include="JScript"/>
</ItemGroup>
Nota
Alcuni nomi di tipi di elementi sono specifici di Visual Studio, ma non sono inclusi in questo elenco a discesa.
Compilatori in-process
Quando possibile, in Visual Studio viene eseguito un tentativo di utilizzare le versioni in-process dei compilatori Visual Basic o Visual C# per offrire prestazioni migliori. Affinché questo tentativo abbia esito positivo, è necessario che siano soddisfatte le condizioni riportate di seguito:
In una destinazione del progetto, deve essere presente un'attività denominata Csc (per i progetti di Visual C#) oppure Vbc (per i progetti di Visual Basic)
Il parametro UseHostCompilerIfAvailable dell'attività deve essere impostato su true.
È necessario specificare solo i valori dei parametri supportati. Tutti i parametri specificati nell'attività sono supportati dal compilatore in-process, ma alcuni valori dei parametri non sono supportati. I valori dei parametri dell'attività Csc non sono supportati dal compilatore in-process di Visual C#:
NoConfig: i valori false e quelli vuoti non sono supportati.
ResponseFiles: i valori non vuoti non sono supportati.
AdditionalLibPaths: i valori non vuoti non sono supportati.
AddModules: i valori non vuoti non sono supportati.
CodePage: i valori diversi da zero non sono supportati.
GenerateFullPaths: true non è supportato.
LinkResources: i valori non vuoti non sono supportati.
Se queste condizioni non sono soddisfatte, il progetto verrà compilato utilizzando il compilatore della riga di comando anziché quello in-process.
IntelliSense in fase di progettazione
Per ottenere il supporto di IntelliSense in Visual Studio prima della creazione di un assembly di output nella compilazione, è necessario che vengano soddisfatte le condizioni seguenti:
Deve essere presente una destinazione denominata Compile.
La destinazione Compile o una delle relative dipendenze deve chiamare l'attività del compilatore per il progetto, ad esempio Csc o Vbc.
Tramite la destinazione Compile o una delle relative dipendenze è necessario che il compilatore riceva tutti i parametri necessari per IntelliSense, in particolare tutti i riferimenti.
È necessario soddisfare le condizioni elencate nella sezione "Compilatori in-process".
Compilazione di soluzioni
In Visual Studio il file di soluzione e l'ordine di compilazione dei progetti sono controllati dallo stesso Visual Studio. Quando si compila una soluzione con msbuild.exe alla riga di comando, MSBuild analizza il file di soluzione e ordina le compilazioni dei progetti. In entrambi i casi i progetti vengono compilati singolarmente in ordine di dipendenza, senza attraversare i riferimenti progetto per progetto. Al contrario, quando vengono compilati progetti singoli con msbuild.exe, vengono attraversati i riferimenti progetto per progetto.
Quando si esegue le compilazione all'interno di Visual Studio, la proprietà $(BuildingInsideVisualStudio) è impostata su true. Questa impostazione può essere utilizzata nel progetto o nei file TARGETS per modificare il comportamento della compilazione.
Visualizzazione delle proprietà e degli elementi
Visual Studio riconosce alcuni nomi e valori delle proprietà. Ad esempio, la proprietà riportata di seguito determinerà la visualizzazione di Applicazione Windows nella casella Tipo di applicazione in Progettazione progetti.
<OutputType>WinExe</OutputType>
Il valore della proprietà può essere modificato in Progettazione progetti e salvato nel file di progetto. Se a tale proprietà viene assegnato un valore non valido tramite modifica manuale, in Visual Studio viene visualizzato un avviso al caricamento del progetto e il valore non valido viene sostituito con un valore predefinito.
Visual Studio riconosce i valori predefiniti per alcune proprietà. Queste proprietà non verranno mantenute nel file di progetto a meno che non presentino valori non predefiniti.
Le proprietà con nomi arbitrari non vengono visualizzate in Visual Studio. Per modificare le proprietà arbitrarie in Visual Studio, è necessario aprire il file di progetto nell'editor XML e modificarle manualmente. Per ulteriori informazioni, vedere How to: Edit Project Files.
Gli elementi definiti nel progetto con nomi di tipi di elementi arbitrari vengono visualizzati per impostazione predefinita in Esplora soluzioni nel nodo del relativo progetto. Per nascondere un elemento, impostare i metadati Visible su false. Ad esempio, l'elemento riportato di seguito parteciperà al processo di compilazione ma non verrà visualizzato in Esplora soluzioni.
<ItemGroup>
<IntermediateFile Include="cache.temp">
<Visible>false</Visible>
</IntermediateFile>
</ItemGroup>
Per impostazione predefinita, gli elementi dichiarati nei file importati nel progetto non vengono visualizzati. Gli elementi creati nel corso del processo di compilazione non vengono mai visualizzati in Esplora soluzioni.
Condizioni su elementi e proprietà
Durante una compilazione, tutte le condizioni sono completamente rispettate.
Quando vengono determinati i valori delle proprietà da visualizzare, le proprietà considerate da Visual Studio come dipendenti dalla configurazione vengono valutate in modo diverso rispetto alle proprietà considerate indipendenti dalla configurazione. Per le proprietà considerate dipendenti dalla configurazione, in Visual Studio vengono impostate le proprietà Configuration e Platform in modo appropriato e viene richiesta la rivalutazione del progetto da parte di MSBuild. Per le proprietà considerate indipendenti dalla configurazione, la modalità di valutazione delle condizioni non è determinata.
Le espressioni condizionali sugli elementi vengono sempre ignorate allo scopo di decidere se l'elemento deve essere visualizzato in Esplora soluzioni.
Debug
Per trovare e avviare l'assembly di output e connettere il debugger, in Visual Studio è necessario che le proprietà OutputPath, AssemblyName e OutputType siano definite correttamente. La connessione del debugger avrà esito negativo se tramite il processo di compilazione il compilatore non genererà un file PDB.
Esecuzione delle destinazioni in fase di progettazione
In Visual Studio viene effettuato un tentativo di eseguire le destinazioni con determinati nomi al momento del caricamento di un progetto. Tali destinazioni includono Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths e CopyRunEnvironmentFiles. Visual Studio esegue tali destinazioni in modo da consentire l'inizializzazione del compilatore per fornire IntelliSense, l'inizializzazione del debugger e la risoluzione dei riferimenti visualizzati in Esplora soluzioni. Se tali destinazioni non sono presenti, il progetto verrà caricato e compilato correttamente, ma la fase di progettazione in Visual Studio non sarà completamente funzionale.
Modifica dei file di progetto in Visual Studio
Quando è necessario modificare direttamente un progetto di MSBuild, è possibile aprire il file di progetto nell'editor XML di Visual Studio. Per ulteriori informazioni, vedere How to: Edit Project Files.
IntelliSense e convalida
Quando si utilizza l'editor XML per modificare i file di progetto, IntelliSense e la convalida si basano sui file di schema di MSBuild. Tali file vengono installati da Visual Studio nella cache dello schema, che si trova nella cartella [percorso di installazione di Visual Studio]\Xml\Schemas.
I tipi MSBuild principali sono definiti in Microsoft.Build.Core.xsd e i tipi comuni utilizzati da Visual Studio sono definiti in Microsoft.Build.CommonTypes.xsd. Per personalizzare gli schemi in modo da disporre di IntelliSense e della funzionalità di convalida per attività, proprietà e nomi di tipi di elementi personalizzati, è possibile modificare Microsoft.Build.xsd oppure creare uno schema personalizzato che includa lo schema CommonTypes o Core. Se viene creato uno schema personalizzato, è necessario indicare all'editor XML come individuarlo tramite la finestra Proprietà.
Modifica dei file di progetto caricati
In Visual Studio il contenuto dei file di progetto e dei file importati dai file di progetto viene memorizzato nella cache. Se si modifica un file di progetto caricato, in Visual Studio viene automaticamente richiesto di ricaricare il progetto in modo da rendere effettive le modifiche. Tuttavia, se si modifica un file importato da un progetto caricato, non verrà richiesto il ricaricamento e sarà necessario scaricare e ricaricare manualmente il progetto per rendere effettive le modifiche.
Gruppi di output
Diverse destinazioni definite in Microsoft.Common.targets hanno nomi che terminano con OutputGroups o OutputGroupDependencies. In Visual Studio queste destinazioni vengono chiamate per ottenere elenchi specifici di output di progetto. Ad esempio, la destinazione SatelliteDllsProjectOutputGroup crea un elenco di tutti gli assembly satellite che verranno creati da una compilazione. Tali gruppi di output vengono utilizzati da funzionalità come la pubblicazione, la distribuzione e i riferimenti progetto per progetto. I progetti per i quali tali gruppi non sono definiti vengono caricati e compilati in Visual Studio, ma alcune funzionalità potrebbero non funzionare correttamente.
Risoluzione dei riferimenti
La risoluzione dei riferimenti è il processo di utilizzo degli elementi di riferimento archiviati in un file di progetto per individuare gli assembly effettivi. In Visual Studio è necessario attivare la risoluzione dei riferimenti per visualizzare proprietà dettagliate per ogni riferimento nella finestra Proprietà. Nell'elenco riportato di seguito vengono descritti tre tipi di riferimenti e le relative modalità di risoluzione.
Riferimenti dell'assembly:
Il sistema di progetto chiama una destinazione con il nome noto ResolveAssemblyReferences. Tale destinazione deve produrre elementi con il nome di tipi di elementi ReferencePath. Ognuno di questi elementi deve avere una specifica dell'elemento (il valore dell'attributo Include di un elemento) che contiene il percorso completo del riferimento. Gli elementi devono disporre di tutti i metadati derivati dagli elementi di input passati, oltre ai nuovi metadati riportati di seguito:
CopyLocal, che indica se l'assembly deve essere copiato nella cartella di output, impostato su true o false.
OriginalItemSpec, che contiene la specifica dell'elemento originale del riferimento.
ResolvedFrom, impostato su "{TargetFrameworkDirectory}" se è stato risolto dalla directory .NET Framework.
Riferimenti COM:
Il sistema di progetto chiama una destinazione con il nome noto ResolveCOMReferences. Tale destinazione deve produrre elementi con il nome di tipi di elementi ComReferenceWrappers. Ognuno di questi elementi deve avere una specifica dell'elemento che contiene il percorso completo dell'assembly di interoperabilità per il riferimento COM. Gli elementi devono disporre di tutti i metadati derivati dagli elementi di input passati, oltre ai nuovi metadati con il nome CopyLocal, che indicano se l'assembly deve essere copiato nella cartella di output, impostato su true o false
Riferimenti nativi
Il sistema di progetto chiama una destinazione con il nome noto ResolveNativeReferences. Tale destinazione deve produrre elementi con il nome di tipi di elementi NativeReferenceFile. Gli elementi devono disporre di tutti i metadati derivati dagli elementi di input passati, oltre a un nuovo metadato singolo denominato OriginalItemSpec, che contiene la specifica dell'elemento originale del riferimento.
Collegamenti alle prestazioni
In Visual Studio il processo di compilazione utilizza un controllo di aggiornamento rapido per migliorare le prestazioni. In alcuni casi in cui le compilazioni personalizzate consentono di creare file che vengono a loro volta compilati, il controllo di aggiornamento rapido non identifica correttamente i file modificati. Per i progetti che necessitano di controlli di aggiornamento più approfonditi, è possibile disattivare il controllo rapido impostando la variabile di ambiente DISABLEFASTUPTODATECHECK=1. In alternativa, questo oggetto può essere impostato come proprietà MSBuild nel progetto o in un file importato dal progetto.