Integrazione di Visual Studio (MSBuild)
Aggiornamento: novembre 2007
In Visual Studio 2005 è contenuto MSBuild, utilizzato per caricare e generare progetti gestiti. Poiché MSBuild è responsabile del progetto, in Visual Studio è possibile utilizzare efficacemente praticamente qualsiasi progetto nel formato MSBuild, anche se il progetto è stato creato da uno strumento diverso e presenta un processo di generazione personalizzato.
In questo argomento vengono descritti aspetti specifici dell'hosting MSBuild di Visual Studio che devono essere considerati quando si personalizzano progetti e file TARGETS che si desidera caricare e generare in Visual Studio. Tali aspetti saranno utili per accertarsi che le funzionalità di Visual Studio, come IntelliSense e debug, siano funzionali al 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. Tuttavia, Visual Studio riconosce solo un sottoinsieme di queste estensioni del nome di file del progetto, che determinano il sistema di progetto specifico del linguaggio che caricherà il progetto. In Visual Studio non è disponibile un sistema di progetto indipendente dal linguaggio basato su MSBuild.
Ad esempio, il sistema di progetto Visual C# carica file CSPROJ, ma Visual Studio non è in grado di caricare un file 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, Visual C# o Visual J# da caricare in Visual Studio.
Nomi di destinazione noti
Scegliendo il comando Genera in Visual Studio verrà eseguita la destinazione predefinita del progetto. Spesso tale destinazione viene anche denominata Build. Scegliendo il comando Rigenera 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
Nei progetti di MSBuild le configurazioni sono rappresentate da proprietà raggruppate in un elemento PropertyGroup che contiene un attributo Condition. In Visual Studio tali condizioni sono esaminate per creare un elenco di configurazioni e piattaforme di progetto 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 le condizioni vengono esaminate su PropertyGroup, ItemGroup, Import, elementi di proprietà ed elementi.
Operazioni di generazione aggiuntive
Visual Studio consente di modificare il nome dell'insieme di elementi di un file in un progetto mediante la proprietà Operazione di generazione nella finestra Proprietà dei file. I nomi di insieme di elementi Compile, EmbeddedResource, Content e None sono sempre elencati in questo menu, insieme a tutti gli altri nomi di insieme di elementi già presenti nel progetto. Per accertarsi che tutti i nomi di insieme di elementi personalizzati siano sempre disponibili in questo menu, è possibile aggiungerli a un insieme di elementi 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 insieme di elementi sono specifici di Visual Studio, ma non sono elencati in questo elenco a discesa. |
Compilatori in-process
Quando possibile, in Visual Studio verrà effettuato il tentativo di utilizzare le versioni in-process dei compilatori Visual Basic o Visual C# per ottenere prestazioni superiori. 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 IntelliSense in Visual Studio prima della creazione di un assembly di output nella generazione, è necessario soddisfare le condizioni riportate di seguito:
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".
Generazione di soluzioni
All'interno di Visual Studio, il file di soluzione e l'ordine di generazione dei progetti sono controllati dallo stesso Visual Studio. Quando si genera una soluzione con msbuild.exe sulla riga di comando, MSBuild analizza il file di soluzione e ordina le generazioni dei progetti. In entrambi i casi i progetti vengono generati singolarmente in ordine di dipendenza, senza attraversare i riferimenti progetto per progetto. Al contrario, quando vengono generati progetti singoli con msbuild.exe, vengono attraversati i riferimenti progetto per progetto.
Quando si esegue le generazione 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 generazione.
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 verrà visualizzato un avviso al caricamento del progetto e il valore non valido verrà 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 Procedura: modificare i file di progetto.
Gli elementi definiti nel progetto con nomi di insieme 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 generazione 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 generazione non vengono mai visualizzati in Esplora soluzioni.
Condizioni su elementi e proprietà
Durante una generazione, 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 sono 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 in 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 generazione il compilatore non genererà un file PDB.
Esecuzione delle destinazioni in fase di progettazione
In Visual Studio viene effettuato il tentativo di eseguire le destinazioni con determinati nomi quando si carica un progetto. Tali destinazioni comprendono 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 generato 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 Procedura: modificare i file di progetto.
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, il cui percorso è [percorso installazione di Visual Studio]\Xml\Schemas.
I tipi di MSBuild di base sono definiti in Microsoft.Build.Core.xsd mentre 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 convalida per i nomi, le proprietà e le attività dell'insieme di elementi personalizzati, è possibile modificare Microsoft.Build.xsd oppure creare uno schema personalizzato che comprenda gli schemi 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, Visual Studio richiederà automaticamente 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
Numerose destinazioni definite in Microsoft.Common.targets hanno nomi che terminano con OutputGroups o OutputGroupDependencies. In Visual Studio tali destinazioni sono 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 generazione. 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 verranno caricati e generati in Visual Studio, ma alcune funzionalità potrebbero non funzionare correttamente.
Risoluzione dei riferimenti
La risoluzione dei riferimenti è il processo tramite il quale vengono utilizzati gli elementi di riferimento memorizzati in un file di progetto per individuare gli assembly effettivi. In Visual Studio la risoluzione dei riferimenti deve essere attivata 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 insieme 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 insieme 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 insieme 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.