Integrazione di Visual Studio (MSBuild)

Visual Studio ospita MSBuild per caricare e compilare progetti gestiti. Poiché MSBuild è responsabile del progetto, quasi tutti i progetti nel formato MSBuild possono essere usati correttamente in Visual Studio, anche se il progetto è stato creato da uno strumento diverso e ha un processo di compilazione personalizzato.

Questo articolo descrive aspetti specifici dell'hosting MSBuild di Visual Studio che devono essere presi in considerazione durante la personalizzazione di progetti e file con estensione targets da caricare e compilare in Visual Studio. Questi consentono di assicurarsi che le funzionalità di Visual Studio come IntelliSense e il debug funzionino per il progetto personalizzato.

Per informazioni sui progetti C++, vedere File di progetto.

Estensioni dei file di progetto

MSBuild.exe riconosce qualsiasi estensione del nome di file di progetto corrispondente al modello .*proj. Tuttavia, Visual Studio riconosce solo un subset di queste estensioni di file di progetto, che determinano il sistema di progetto specifico del linguaggio che caricherà il progetto. Visual Studio non dispone di un sistema di progetto basato su MSBuild indipendente dal linguaggio.

Ad esempio, il sistema di progetto C# carica i file con estensione csproj , ma Visual Studio non è in grado di caricare un file con estensione xxproj . Un file di progetto per i file di origine in un linguaggio arbitrario deve usare la stessa estensione dei file di progetto Visual Basic o C# da caricare in Visual Studio.

Nomi di destinazione noti

Facendo clic sul comando Compila in Visual Studio verrà eseguita la destinazione predefinita nel 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 MSBuild in base alle proprietà raggruppate in un PropertyGroup elemento che contiene un Condition attributo. Visual Studio esamina queste condizioni 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' "

Visual Studio esamina le condizioni per PropertyGroupgli elementi , ItemGroup, Import, proprietà e elemento a questo scopo.

Altre azioni di compilazione

Visual Studio consente di modificare il nome del tipo di elemento di un file in un progetto con la proprietà Azione di compilazione della finestra Proprietà file. I nomi dei tipi di elemento Compile, EmbeddedResource, Content e None sono sempre elencati in questo menu, insieme a tutti gli altri nomi di tipi di elemento 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. Aggiungendo, ad esempio, il codice riportato di seguito al file di progetto si aggiunge il tipo personalizzato JScript a questo menu per tutti i progetti che lo importano:

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

L'aggiunta di nomi dei tipi di elemento al AvailableItemName tipo di elemento causerà la visualizzazione di elementi di tale tipo in Esplora soluzioni.

Nota

Alcuni nomi dei tipi di elemento sono speciali per Visual Studio, ma non elencati in questo elenco a discesa.

Compilatori In-Process

Quando possibile, Visual Studio tenterà di usare la versione in-process del compilatore Visual Basic per migliorare le prestazioni. (Non applicabile a C#). Per il corretto funzionamento, è necessario soddisfare le condizioni seguenti:

  • In una destinazione del progetto deve essere presente un'attività denominata Vbc per i progetti Visual Basic.

  • Il parametro UseHostCompilerIfAvailable dell'attività deve essere impostato su true.

IntelliSense in fase di progettazione

Per ottenere il supporto di IntelliSense in Visual Studio prima che una compilazione abbia generato un assembly di output, è necessario soddisfare 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.

Creazione di soluzioni

All'interno di Visual Studio, il file della soluzione e l'ordinamento della compilazione del progetto sono controllati da Visual Studio stesso. Quando si compila una soluzione con msbuild.exe nella riga di comando, MSBuild analizza il file della soluzione e ordina le compilazioni del progetto. In entrambi i casi i progetti vengono compilati singolarmente in ordine di dipendenza, senza attraversare i riferimenti progetto per progetto. Al contrario, quando si esegue la compilazione di progetti singoli con msbuild.exe, i riferimenti da progetto a progetto vengono attraversati.

Durante la compilazione all'interno di Visual Studio, la proprietà $(BuildingInsideVisualStudio) viene impostata su true. Questa impostazione può essere usata nel progetto o nei file con estensione targets per modificare il comportamento della compilazione.

Visualizzare proprietà ed elementi

Visual Studio riconosce determinati nomi e valori di 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 modificando a mano, Visual Studio visualizzerà un avviso quando il progetto viene caricato e sostituirà il valore non valido con un valore predefinito.

Visual Studio riconosce le impostazioni predefinite 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 proprietà arbitrarie in Visual Studio, è necessario aprire il file di progetto nell'editor XML e modificarle a mano. Per altre informazioni, vedere la sezione Modificare file di progetto in Visual Studio più avanti in questo argomento.

Gli elementi definiti nel progetto con nomi di tipi di elemento arbitrari vengono visualizzati per impostazione predefinita in Esplora soluzioni nel rispettivo nodo del progetto. Per nascondere un elemento, impostare i metadati Visible su false. L'elemento riportato di seguito, ad esempio, parteciperà al processo di compilazione ma non verrà visualizzato in Esplora soluzioni.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Nota

I Visible metadati vengono ignorati da Esplora soluzioni per i progetti C++. Gli elementi verranno sempre visualizzati anche se Visible è impostato su false.

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 per elementi e proprietà

Durante una compilazione, tutte le condizioni sono completamente rispettate.

Quando si determinano i valori delle proprietà da visualizzare, le proprietà che Visual Studio considera dipendenti dalla configurazione vengono valutate in modo diverso rispetto alle proprietà considerate indipendenti dalla configurazione. Per le proprietà considerate dipendenti dalla configurazione, Visual Studio imposta le Configuration proprietà e Platform in modo appropriato e indica a MSBuild di rivalutare il progetto. Per le proprietà considerate indipendenti dalla configurazione, la modalità di valutazione delle condizioni non è determinata.

Le espressioni condizionali per gli elementi vengono sempre ignorate al momento di decidere se l'elemento deve essere visualizzato in Esplora soluzioni.

Debug

Per trovare e avviare l'assembly di output e collegare il debugger, Visual Studio richiede le proprietà OutputPath, AssemblyNamee OutputType definite correttamente. La connessione del debugger non riesce se con il processo di compilazione il compilatore non ha generato un file con estensione pdb.

Esecuzione delle destinazioni in fase di progettazione

Visual Studio tenta di eseguire destinazioni con determinati nomi quando carica un progetto. Tali destinazioni includono Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths e CopyRunEnvironmentFiles. Visual Studio esegue queste destinazioni in modo che il compilatore possa essere inizializzato per fornire IntelliSense, il debugger può essere inizializzato e i riferimenti visualizzati in Esplora soluzioni possono essere risolti. Se queste destinazioni non sono presenti, il progetto verrà caricato e compilato correttamente, ma l'esperienza in fase di progettazione in Visual Studio non sarà completamente funzionante.

Modificare file di progetto in Visual Studio

Per modificare direttamente un progetto MSBuild, è possibile aprire il file di progetto nell'editor XML di Visual Studio.

Per scaricare e modificare un file di progetto in Visual Studio

  1. In Esplora soluzioniaprire il menu di scelta rapida per il progetto e scegliere Scarica progetto.

    Il progetto verrà contrassegnato come (non disponibile).

  2. In Esplora soluzioni aprire il menu di scelta rapida per il progetto non disponibile e quindi scegliere Modifica <file di> progetto.

    Il file del progetto verrà aperto nell'editor XML di Visual Studio.

  3. Modificare, salvare e chiudere il file di progetto.

  4. In Esplora soluzioniaprire il menu di scelta rapida per il progetto non disponibile e scegliere Ricarica progetto.

IntelliSense e convalida

Quando si usa l'editor XML per modificare i file di progetto, IntelliSense e la convalida sono basati sui file di schema MSBuild. Questi vengono installati nella cache dello schema, disponibile nella <directory> di installazione di Visual Studio\Xml\Schemas\1033\MSBuild.

I tipi MSBuild principali sono definiti in Microsoft.Build.Core.xsd e i tipi comuni usati da Visual Studio sono definiti in Microsoft.Build.CommonTypes.xsd. Per personalizzare gli schemi in modo da avere IntelliSense e la 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à .

Modificare i file di progetto caricati

Visual Studio memorizza nella cache il contenuto dei file di progetto e dei file importati dai file di progetto. Se si modifica un file di progetto caricato, Visual Studio chiederà automaticamente di ricaricare il progetto in modo che le modifiche vengano applicate. 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. Visual Studio chiama queste destinazioni per ottenere elenchi specifici di output del 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 usati da funzionalità come la pubblicazione, la distribuzione e i riferimenti progetto per progetto. I progetti che non li definiscono verranno 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. Visual Studio deve 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 avere tutti i metadati derivati dagli elementi di input passati, oltre ai nuovi metadati con il nome CopyLocal, che indica se l'assembly deve essere copiato nella cartella di output e che può essere 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

Se si usa l'IDE di Visual Studio per avviare il debug (scegliendo il tasto F5 o scegliendo Debug>Avvia debug nella barra dei menu) o per compilare il progetto (ad esempio, Compila>soluzione di compilazione), il processo di compilazione usa 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.