Condividi tramite


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 .targets file che si desidera 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 di file di progetto

MSBuild.exe riconosce qualsiasi estensione 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.

In alternativa, l'estensione *.msbuildproj è supportata.

Nomi di destinazione noti

Facendo clic sul comando Compila in Visual Studio verrà eseguita la destinazione predefinita nel progetto. Spesso, questa destinazione è anche denominata Build. La scelta del comando Ricompila o Pulisci tenterà di eseguire una destinazione con lo stesso nome nel progetto. Facendo clic su 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 questo elenco, le condizioni devono avere un formato simile al seguente:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

Visual Studio esamina le condizioni sugli elementi PropertyGroup, ItemGroup, Import, proprietà ed elementi a questo scopo.

Azioni di compilazione aggiuntive

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 qualsiasi altro nome di tipo di elemento già presente nel progetto. Per assicurarsi che tutti i nomi dei tipi di elemento personalizzati siano sempre disponibili in questo menu, è possibile aggiungere i nomi a un tipo di elemento denominato AvailableItemName. Ad esempio, l'aggiunta del codice seguente al file di progetto aggiungerà 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 quel tipo in Esplora soluzioni.

Annotazioni

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 UseHostCompilerIfAvailable parametro 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 Compile destinazione o una delle relative dipendenze deve chiamare l'attività del compilatore per il progetto, ad esempio Csc o Vbc.

  • La Compile destinazione o una delle relative dipendenze deve far sì che il compilatore riceva tutti i parametri necessari per IntelliSense, in particolare tutti i riferimenti.

  • Le condizioni elencate nella sezione Compilatori in-process devono essere soddisfatte.

Creare 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 e i riferimenti di progetto a progetto non vengono attraversati. Al contrario, quando vengono compilati singoli progetti con msbuild.exe, vengono attraversati i riferimenti di progetto a progetto.

Durante la compilazione all'interno di Visual Studio, la proprietà $(BuildingInsideVisualStudio) viene impostata su true. Questa operazione può essere usata nei file di progetto o .targets per fare in modo che la compilazione si comporti in modo diverso.

Visualizzare proprietà ed elementi

Visual Studio riconosce determinati nomi e valori di proprietà. Ad esempio, la proprietà seguente in un progetto causerà la visualizzazione dell'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 rese persistenti nel file di progetto, a meno che non abbiano 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 Modifica 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 nodo del progetto. Per nascondere un elemento dalla visualizzazione, impostare i Visible metadati su false. Ad esempio, l'elemento seguente parteciperà al processo di compilazione ma non verrà visualizzato in Esplora soluzioni.

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

Annotazioni

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

Gli elementi dichiarati nei file importati nel progetto non vengono visualizzati per impostazione predefinita. Gli elementi creati durante il processo di compilazione non vengono mai visualizzati in Esplora soluzioni.

Condizioni per elementi e proprietà

Durante un build, tutte le condizioni vengono rispettate completamente.

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à che considera indipendenti dalla configurazione, è indeterminato come verranno valutate le condizioni.

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

Risoluzione dei problemi

Per trovare e avviare l'assembly di output e collegare il debugger, Visual Studio richiede le proprietà OutputPath, AssemblyNamee OutputType definite correttamente. Il debugger non verrà collegato se il processo di compilazione non ha causato la generazione di un file con estensione pdb da parte del compilatore.

Esecuzione dell'obiettivo in fase di progettazione

Visual Studio tenta di eseguire destinazioni con determinati nomi quando carica un progetto. Queste 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 i 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 soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto e quindi scegliere Scarica progetto.

    Il progetto è contrassegnato come (non disponibile).The project is marked (unavailable).

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto non disponibile e quindi scegliere Modifica <file di> progetto.

    Il file di progetto viene aperto nell'editor XML di Visual Studio.

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

  4. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto non disponibile e quindi 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 convalida per nomi, proprietà e attività di tipi di elemento personalizzati, è possibile modificare Microsoft.Build.xsd o creare uno schema personalizzato che includa gli schemi CommonTypes o Core. Se si crea uno schema personalizzato, sarà necessario indirizzare l'editor XML a trovarlo usando 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à visualizzato alcun messaggio di 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 SatelliteDllsProjectOutputGroup destinazione crea un elenco di tutti gli assembly satellite che verrà creata da una compilazione. Questi gruppi di output sono utilizzati da funzionalità come pubblicazione, distribuzione e riferimenti tra progetti. 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 seguente vengono descritti i tre tipi di riferimenti e il modo in cui vengono risolti.

  • Riferimenti agli assembly:

    Il sistema di progetto chiama un target con il nome noto ResolveAssemblyReferences. Questa destinazione deve produrre elementi con il tipo di elemento denominato ReferencePath. Ognuno di questi elementi deve avere una specifica dell'elemento (il valore dell'attributo Include di un elemento) contenente il percorso completo del riferimento. Gli elementi devono avere tutti i metadati degli elementi di input passati oltre ai nuovi metadati seguenti:

    • CopyLocal, che indica se l'assembly deve essere copiato nella cartella di output, impostato su true o false.

    • OriginalItemSpec, contenente la specifica originale dell'elemento del riferimento.

    • ResolvedFrom, impostato su "{TargetFrameworkDirectory}" se è stato risolto dalla directory di .NET Framework.

  • Riferimenti COM:

    Il sistema di progetto chiama una destinazione con il noto nome ResolveCOMReferences. Questa destinazione deve produrre elementi con il nome del tipo di elemento ComReferenceWrappers. Ognuno di questi elementi deve avere una specifica dell'elemento contenente il percorso completo dell'assembly di interoperabilità per il riferimento COM. Gli elementi devono includere tutti i metadati trasferiti dagli elementi di input, oltre a nuovi metadati con il nome CopyLocal, che indicano se l'assembly debba essere copiato nella cartella di output, impostato su true o false.

  • Riferimenti nativi

    Il sistema di progetto chiama un obiettivo con il noto nome ResolveNativeReferences. Questa destinazione deve produrre elementi del tipo di elemento con il nome NativeReferenceFile. Gli elementi devono avere tutti i metadati degli elementi di input passati, oltre a un nuovo frammento di metadati denominato OriginalItemSpec, contenente la specifica originale dell'elemento del riferimento.

Tasti di scelta rapida per le 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 creano file che a loro volta vengono compilati, il controllo dell'aggiornamento rapido non identifica correttamente i file modificati. I progetti che richiedono controlli di aggiornamento più approfonditi possono disattivare il controllo rapido impostando la variabile DISABLEFASTUPTODATECHECK=1di ambiente . In alternativa, i progetti possono impostare questa proprietà come proprietà MSBuild nel progetto o in un file importato dal progetto.