Condividi tramite


Funzioni delle proprietà

Le funzioni di proprietà sono chiamate a metodi .NET visualizzati nelle definizioni delle proprietà di MSBuild. In genere vengono usati per costruire definizioni di proprietà che richiedono una logica più complessa.

A differenza delle attività, le funzioni di proprietà possono essere usate al di fuori dei target. Le funzioni di proprietà vengono valutate ogni volta che vengono espanse le proprietà o gli elementi. Pertanto, per le proprietà e gli elementi esterni a qualsiasi destinazione, le funzioni di proprietà vengono valutate prima di qualsiasi esecuzione di destinazione. Per i gruppi di proprietà e i gruppi di elementi all'interno delle destinazioni, le funzioni di proprietà vengono valutate quando viene eseguita la destinazione.

Senza usare le attività MSBuild, è possibile leggere l'ora di sistema, confrontare le stringhe, trovare le espressioni regolari ed eseguire altre azioni nello script di compilazione. MSBuild tenta di convertire la stringa in numero e numero in stringa ed eseguire altre conversioni in base alle esigenze.

I valori stringa restituiti dalle funzioni di proprietà hanno caratteri di escape speciali . Se desideri che il valore venga considerato come se fosse inserito direttamente nel file di progetto, usa $([MSBuild]::Unescape()) per annullare l'escape dei caratteri speciali.

Sintassi della funzione property

Esistono tre tipi di funzioni di proprietà; ogni tipo ha una sintassi diversa:

  • Funzioni della proprietà String (istanza)
  • Funzioni delle proprietà statiche
  • Funzioni delle proprietà MSBuild

Funzioni delle proprietà stringhe

Tutti i valori delle proprietà di compilazione sono semplici valori stringa. È possibile usare metodi stringa (istanza) per operare su qualsiasi valore della proprietà. Ad esempio, è possibile estrarre il nome dell'unità (i primi tre caratteri) da una proprietà di compilazione che rappresenta un percorso completo usando questo codice:

$(ProjectOutputFolder.Substring(0,3))

Funzioni delle proprietà statiche

Nello script di compilazione è possibile accedere alle proprietà statiche e ai metodi di molte classi di sistema. Per ottenere il valore di una proprietà statica, utilizzare la sintassi seguente, dove Class è il nome della classe di sistema e Property è il nome della proprietà.

$([Class]::Property)

Ad esempio, è possibile usare il codice seguente per impostare una proprietà di compilazione sulla data e l'ora correnti.

<Today>$([System.DateTime]::Now)</Today>

Per chiamare un metodo statico, utilizzare la sintassi seguente, dove Class è il nome della classe di sistema, Method è il nome del metodo ed (Parameters) è l'elenco di parametri per il metodo :

$([Class]::Method(Parameters))

Ad esempio, per impostare una proprietà di compilazione su un nuovo GUID, è possibile usare questo script:

<NewGuid>$([System.Guid]::NewGuid())</NewGuid>

Per i metodi di overload, MSBuild tenta di trovare un metodo con parametri corrispondenti.

In MSBuild 17.14 e versioni successive è possibile usare la sintassi out _ dei parametri per specificare un out parametro. Vedere Parametri di riferimento. Il valore del out parametro viene ignorato. Per esempio:

<IsInteger>$([System.Int32]::TryParse("123", out _))</IsInteger>

La proprietà IsInteger è true se l'input viene analizzato correttamente come intero, ma il valore analizzato viene ignorato.

Nelle funzioni delle proprietà statiche è possibile usare qualsiasi metodo statico pubblico o proprietà definita in .NET Standard 2.0 per queste classi di sistema:

Annotazioni

I metodi e le proprietà non definiti in .NET Standard 2.0 potrebbero essere disponibili quando si usa MSBuild in un ambiente che li supporta, ma non è garantito che siano disponibili in tutte le situazioni. Per motivi di compatibilità, è consigliabile evitarli.

Inoltre, è possibile usare i metodi e le proprietà statici seguenti:

Funzioni delle proprietà System.OperatingSystem

Le System.OperatingSystem funzioni di proprietà restituiscono informazioni sul sistema operativo in cui è in esecuzione MSBuild. Ad esempio, se il progetto è destinato a Linux e lo si compila in macOS, le funzioni di proprietà restituiscono informazioni su macOS.

In MSBuild in esecuzione in .NET (dotnet build), tutti i metodi statici della System.OperatingSystem classe sono chiamabili come funzioni di proprietà statiche.

In MSBuild in esecuzione in .NET Framework (MSBuild.exe), solo i seguenti metodi di System.OperatingSystem sono chiamabili come funzioni di proprietà statica. MSBuild li implementa internamente, perché System.OperatingSystem non li definisce in .NET Framework. I metodi per i sistemi operativi per i quali non è disponibile .NET SDK, ad esempio System.OperatingSystem::IsTvOS, non sono chiamabili.

Nell'esempio seguente viene illustrato l'utilizzo di queste funzioni di proprietà.

<IsWindows>$([System.OperatingSystem]::IsWindows())</IsWindows>

Chiamata di metodi di istanza su proprietà statiche

Se si accede a una proprietà statica che restituisce un'istanza dell'oggetto, è possibile richiamare i metodi di istanza di tale oggetto. Per richiamare un metodo di istanza, utilizzare la sintassi seguente, dove Class è il nome della classe di sistema, è il nome della proprietà, PropertyMethod è il nome del metodo ed (Parameters) è l'elenco di parametri per il metodo :

$([Class]::Property.Method(Parameters))

Il nome della classe deve essere qualificato completamente con lo spazio dei nomi.

Ad esempio, è possibile usare il codice seguente per impostare una proprietà di compilazione sulla data corrente.

<Today>$([System.DateTime]::Now.ToString('yyyy.MM.dd'))</Today>

Funzioni delle proprietà MSBuild

È possibile accedere a diversi metodi statici nella tua costruzione per fornire supporto aritmetico, logico bit a bit e per i caratteri di escape. È possibile accedere a questi metodi usando la sintassi seguente, dove Method è il nome del metodo ed (Parameters) è l'elenco di parametri per il metodo .

$([MSBuild]::Method(Parameters))

Ad esempio, per aggiungere due proprietà con valori numerici, usare il codice seguente.

$([MSBuild]::Add($(NumberOne), $(NumberTwo)))

Di seguito è riportato un elenco delle funzioni delle proprietà MSBuild:

Firma della funzione Descrizione
double Add(double a, double b) Aggiungere due numeri double.
long Add(long a, long b) Aggiungere due longs.
int BitwiseOr(int first, int second) Eseguire un'operazione bit a bit OR sul primo e il secondo (primo | secondo).
int BitwiseAnd(int first, int second) Eseguire un'operazione bit per bit sul primo e secondo (primo & secondo).
int BitwiseXor(int first, int second) Esegui un'operazione a livello di bit XOR sul primo e sul secondo (primo ^ secondo).
int BitwiseNot(int first) Eseguire un'operazione a livello di bit NOT (~first).
string CheckFeatureAvailability(string featureName) Restituisce il nome della funzionalità come stringa se e solo se la funzionalità specificata è supportata in questa versione di MSBuild.
string ConvertToBase64(string toEncode) Restituisce la stringa dopo la conversione di tutti i byte in base 64 (caratteri alfanumerici più + e /), terminando in uno o due =.
string ConvertFromBase64(string toDecode) Restituisce la stringa dopo la conversione da base 64 (caratteri alfanumerici più + e /), terminando in uno o due =.
double Divide(double a, double b) Dividere due doppi.
long Divide(long a, long b) Dividere due numeri interi lunghi.
bool DoesTaskHostExist(string runtime, string architecture) Restituisce se un host di attività è attualmente installato per i valori di runtime e architettura specificati. Vedere MSBuild DoesTaskHostExist.
string Escape(string unescaped) Eseguire l'escape della stringa in base alle regole di escape di MSBuild.
string EnsureTrailingSlash(string path) Se il percorso specificato non ha uno slash finale, aggiungerne uno. Se il percorso è una stringa vuota, non lo modifica. Vedere MSBuild EnsureTrailingSlash.
string FilterTargetFrameworks(string incoming, string filter) Restituisce l'elenco dei framework di destinazione che corrispondono al filtro specificato. Un framework di destinazione da incoming viene mantenuto se corrisponde a uno dei framework di destinazione desiderati in filter. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
string GetCurrentToolsDirectory() Ottenere la directory degli strumenti MSBuild corrente.
string GetMSBuildExtensionsPath() Ottiene il percorso delle estensioni MSBuild. Quando si esegue MSBuild.exe, si tratta in genere della cartella eseguibile di MSBuild. Durante l'esecuzione in Visual Studio, questa è la sottocartella MSBuild nella cartella di installazione di Visual Studio.
string GetMSBuildSDKsPath() Ottiene la directory in cui sono previsti gli SDK per l'istanza di MSBuild corrente.
string GetProgramFiles32() Ottiene la cartella radice del file system in cui vengono in genere installati i pacchetti software a 32 bit. Ad esempio: C:\Program Files (x86).
string GetTargetFrameworkIdentifier(string targetFramework) Analizzare il TargetFrameworkIdentifier da TargetFramework. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
string GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analizzare la TargetFrameworkVersion dal TargetFramework. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
string GetTargetPlatformIdentifier(string targetFramework) Analizzare il TargetPlatformIdentifier dal TargetFramework. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
string GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analizzare il TargetPlatformVersion dal TargetFramework. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
string GetToolsDirectory32() Ottiene la directory in cui si trovano le versioni a 32 bit degli strumenti MSBuild.
string GetToolsDirectory64() Ottiene la directory in cui si trovano le versioni a 64 bit degli strumenti MSBuild.
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) Individuare e restituire la directory di un file nella directory specificata o in una posizione nella struttura di directory al livello superiore rispetto a quella directory. Vedere MSBuild GetDirectoryNameOfFileAbove.
string GetPathOfFileAbove(string file, string startingDirectory) Cerca e restituisce il percorso assoluto di un file nella struttura di directory a partire dalla posizione e al di sopra del file di compilazione corrente, oppure, se specificato, in base a startingDirectory. Vedere MSBuild GetPathOfFileAbove.
object GetRegistryValue(string keyName, string valueName, object defaultValue) Ottenere il valore della chiave e del valore del Registro di sistema. Vedere MSBuild GetRegistryValue.
object GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views) Ottiene i dati del Registro di sistema in base alla chiave del Registro di sistema, al valore e a una o più viste del Registro di sistema ordinate. Vedere MSBuild GetRegistryValueFromView.
string GetVsInstallRoot() Ottiene il percorso completo della radice della cartella di installazione di Visual Studio associata all'istanza corrente di MSBuild.
bool IsOsPlatform(string platformString) Specificare se la piattaforma del sistema operativo corrente è platformString. platformString deve essere un membro di OSPlatform.
bool IsOsBsdLike() True se il sistema operativo corrente è un sistema Unix di tipo BSD.
bool IsOSUnixLike() True se il sistema operativo corrente è un sistema Unix.
bool IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Restituisce "Vero" se il framework di destinazione candidato (secondo argomento) è compatibile con il framework di destinazione indicato dal primo argomento e "false" in caso contrario. Vedere Funzioni TargetFramework e TargetPlatform di MSBuild.
int LeftShift(int operand, int count) Sposta a sinistra per count bit. MSBuild 17.7 e versioni successive.
string MakeRelative(string basePath, string path) Rende path relativo a basePath. basePath deve essere una directory assoluta. Se path non è possibile renderlo relativo, viene restituito testualmente. Simile a Uri.MakeRelativeUri. Vedere MSBuild MakeRelative.
double Modulo(double a, double b) Modulo due doppi.
long Modulo(long a, long b) Modulo di due numeri long.
double Multiply(double a, double b) Moltiplicare due valori double.
long Multiply(long a, long b) Moltiplicare due lunghi.
string NormalizeDirectory(params string[] path) Ottiene il percorso completo normalizzato della directory specificata e garantisce che contenga i caratteri separatori appropriati per il sistema operativo corrente, assicurando al contempo una barra finale.
string NormalizePath(params string[] path) Ottiene il percorso completo canonizzato del percorso specificato e garantisce che contenga i caratteri separatori di directory corretti per il sistema operativo corrente.
int RightShift(int operand, int count) Sposta a destra per count bit, come intero con segno. MSBuild 17.7 e versioni successive.
int RightShiftUnsigned(int operand, int count) Sposta a destra per count bit, trattando l'operando come intero senza segno. MSBuild 17.7 e versioni successive.
object StableStringHash(string toHash, StringHashingAlgorithm algo) Accetta un argomento stringa e restituisce un codice hash che è garantito essere stabile. Vedere MSBuild StableStringHash.
string SubstringByAsciiChars(string input, int start, int length) Restituisce una sottostringa di input, a partire dalla posizione specificata start e con la lunghezza specificata length, trattando la stringa come codificata in ASCII.
double Subtract(double a, double b) Sottrae due valori double.
long Subtract(long a, long b) Sottrae due interi lunghi.
string Unescape(string escaped) Annullare l'escape della stringa in base alle regole di escape di MSBuild.
string ValueOrDefault(string conditionValue, string defaultValue) Restituisce la stringa nel parametro solo se il parametro defaultValueconditionValue è vuoto, altrimenti restituisce il valore conditionValue. Vedere MSBuild ValueOrDefault.
bool VersionEquals(string a, string b) Restituisce true se le versioni a e b sono equivalenti in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.
bool VersionGreaterThan(string a, string b) Restituisce true se la versione a è maggiore di b in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.
bool VersionGreaterThanOrEquals(string a, string b) Restituisce true se la versione a è maggiore o uguale a b in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.
bool VersionLessThan(string a, string b) Restituisce true se la versione a è minore di b in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.
bool VersionLessThanOrEquals(string a, string b) Restituisce true se la versione a è minore o uguale a b in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.
bool VersionNotEquals(string a, string b) Restituisce false se le versioni a e b sono equivalenti in base alle regole seguenti. Vedere Funzioni di confronto delle versioni di MSBuild.

Funzioni delle proprietà annidate

È possibile combinare funzioni di proprietà per formare funzioni più complesse, come illustrato nell'esempio seguente:

$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))

In questo esempio viene restituito il valore di FileAttributes. Archive bit (32 o 0) del file indicato dal percorso tempFile. Si noti che i valori dei dati enumerati non possono essere visualizzati in base al nome in alcuni contesti. Nell'esempio precedente è necessario usare invece il valore numerico (32). In altri casi, a seconda delle aspettative del metodo chiamato, è necessario usare il valore dell'enumerazione. Nell'esempio seguente, il valore di enumerazione RegexOptions. ECMAScript deve essere utilizzato perché non è possibile convertire un valore numerico come previsto da questo metodo.

<PropertyGroup>
    <GitVersionHeightWithOffset>$([System.Text.RegularExpressions.Regex]::Replace("$(PrereleaseVersion)", "^.*?(\d+)$", "$1", "System.Text.RegularExpressions.RegexOptions.ECMAScript"))</GitVersionHeightWithOffset>
</PropertyGroup>

I metadati possono essere visualizzati anche nelle funzioni delle proprietà annidate. Per ulteriori informazioni, vedere Raggruppamento.

MSBuild VerificaSeTaskHostEsiste

La DoesTaskHostExist funzione di proprietà in MSBuild indica se un host del task è attualmente installato per i valori specificati di runtime e di architettura.

Questa funzione di proprietà ha la sintassi seguente:

$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))

MSBuild EnsureTrailingSlash

La EnsureTrailingSlash funzione di proprietà in MSBuild aggiunge una barra finale se non ne esiste già una.

Questa funzione di proprietà ha la sintassi seguente:

$([MSBuild]::EnsureTrailingSlash('$(PathProperty)'))

MSBuild GetDirectoryNameOfFileAbove

La funzione della proprietà MSBuild GetDirectoryNameOfFileAbove cerca verso l'alto una directory contenente il file specificato, a partire da (e includendo) la directory specificata. Restituisce il percorso completo della directory più vicina contenente il file se viene trovato, altrimenti una stringa vuota.

Questa funzione di proprietà ha la sintassi seguente:

$([MSBuild]::GetDirectoryNameOfFileAbove(string startingDirectory, string fileName))

In questo esempio viene illustrato come importare il file EnlistmentInfo.props più vicino nella cartella corrente o nelle cartelle superiori, solo se viene trovata una corrispondenza.

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />

Questo esempio può essere scritto in modo più conciso usando la GetPathOfFileAbove funzione :

<Import Project="$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))' != '' " />

MSBuild GetPathOfFileAbove

La funzione della proprietà MSBuild GetPathOfFileAbove cerca verso l'alto una directory contenente il file specificato, a partire da (e includendo) la directory specificata. Restituisce il percorso completo del file corrispondente più vicino, se trovato, altrimenti una stringa vuota.

Questa funzione di proprietà ha la sintassi seguente:

$([MSBuild]::GetPathOfFileAbove(string file, [string startingDirectory]))

dove file è il nome del file da cercare ed startingDirectory è una directory facoltativa in cui avviare la ricerca. Per impostazione predefinita, la ricerca viene avviata nella directory del file corrente.

In questo esempio viene illustrato come importare un file denominato dir.props in o sopra la directory corrente, solo se viene trovata una corrispondenza:

<Import Project="$([MSBuild]::GetPathOfFileAbove(dir.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(dir.props))' != '' " />

equivalente funzionalmente a

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))' != '' " />

Tuttavia, a volte è necessario avviare la ricerca nella directory padre, per evitare la corrispondenza con il file corrente. In questo esempio viene illustrato come un file Directory.Build.props possa importare il file Directory.Build.props più vicino in un livello rigorosamente superiore dell'albero, senza importare in modo ricorsivo se stesso:

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

equivalente funzionalmente a

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)../', 'Directory.Build.props'))/Directory.Build.props" />

MSBuild GetRegistryValue (Ottieni valore dal Registro)

La funzione della proprietà MSBuild GetRegistryValue restituisce il valore di una chiave del Registro di sistema. Questa funzione accetta due argomenti, il nome della chiave e il nome del valore e restituisce il valore dal Registro di sistema. Se non si specifica un nome di valore, viene restituito il valore predefinito.

Gli esempi seguenti illustrano come viene usata questa funzione:

$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, ``))                                  // default value
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, `SymbolCacheDir`))
$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\SOFTWARE\(SampleName)`, `(SampleValue)`))             // parens in name and value

Avvertimento

Nella versione .NET SDK di MSBuild (dotnet build), questa funzione non è supportata.

MSBuild GetRegistryValueFromView

La funzione della proprietà MSBuild GetRegistryValueFromView ottiene i dati del Registro di sistema in base alla chiave del Registro di sistema, al valore e a una o più viste del Registro di sistema ordinate. La chiave e il valore vengono cercati in ogni visualizzazione del Registro di sistema in ordine fino a quando non vengono trovati.

La sintassi per questa funzione di proprietà è:

[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)

Il sistema operativo Windows a 64 bit gestisce una chiave del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node che presenta una visualizzazione del Registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE per le applicazioni a 32 bit.

Per impostazione predefinita, un'applicazione a 32 bit in esecuzione in WOW64 accede alla visualizzazione del Registro di sistema a 32 bit e un'applicazione a 64 bit accede alla visualizzazione del Registro di sistema a 64 bit.

Le seguenti viste del registro sono disponibili:

Visualizzazione Registro di sistema Definizione
RegistryView.Registry32 Visualizzazione del Registro di sistema dell'applicazione a 32 bit.
RegistryView.Registry64 Visualizzazione del Registro di sistema dell'applicazione a 64 bit.
RegistryView.Default Visualizzazione del Registro di sistema che corrisponde al processo in cui è in esecuzione l'applicazione.

Di seguito è riportato un esempio.

$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32))

Il codice precedente ottiene i dati SLRuntimeInstallPath della chiave ReferenceAssemblies , cercando prima nella visualizzazione del Registro di sistema a 64 bit e quindi nella visualizzazione del Registro di sistema a 32 bit.

Avvertimento

Nella versione .NET SDK di MSBuild (dotnet build), questa funzione non è supportata.

MSBuild MakeRelative

La funzione della proprietà MSBuild MakeRelative restituisce il percorso relativo del secondo percorso rispetto al primo percorso. Ogni percorso può essere un file o una cartella.

Questa funzione di proprietà ha la sintassi seguente:

$([MSBuild]::MakeRelative($(FileOrFolderPath1), $(FileOrFolderPath2)))

Il codice seguente è un esempio di questa sintassi.

<PropertyGroup>
    <Path1>c:\users\</Path1>
    <Path2>c:\users\username\</Path2>
</PropertyGroup>

<Target Name = "Go">
    <Message Text ="$([MSBuild]::MakeRelative($(Path1), $(Path2)))" />
    <Message Text ="$([MSBuild]::MakeRelative($(Path2), $(Path1)))" />
</Target>

<!--
Output:
   username\
   ..\
-->

MSBuild StableStringHash

La funzione della proprietà MSBuild StableStringHash accetta un argomento stringa e restituisce un codice hash che è garantito essere stabile, ovvero lo stesso codice viene sempre restituito per lo stesso input di stringa. L'hash restituito è lo stesso indipendentemente dal fatto che MSBuild o dotnet build sia usato ed è stabile nell'architettura della piattaforma, a differenza del metodo GetHashCode.NET . Non è garantito che sia stabile in diverse versioni di MSBuild.

Questa funzione è disponibile in MSBuild 16.9.0 o versione successiva.

Nell'esempio seguente viene illustrato come viene usata questa funzione.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

Con MSBuild versione 17.10 e successive, questa funzione accetta un secondo argomento facoltativo che specifica quale algoritmo di hashing utilizzare.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

Il secondo argomento non fa distinzione tra maiuscole e minuscole e supporta attualmente i valori seguenti:

  • Legacy: mantiene lo stesso comportamento della chiamata alla funzione senza il secondo argomento. Restituisce un intero con segno a 32 bit con proprietà simili a string.GetHashCode.
  • Fnv1a32bit: restituisce un intero con segno a 32 bit che rappresenta un hash Fowler–Noll-Vo della versione '1a' della stringa specificata.
  • Fnv1a64bit: restituisce un intero con segno a 64 bit che rappresenta un hash Fowler–Noll-Vo della versione '1a' della stringa specificata.
  • Sha256: restituisce una stringa esadecimale senza prefisso che rappresenta un hash SHA256 della stringa specificata.

MSBuild ValueOrDefault

La funzione della proprietà MSBuild ValueOrDefault restituisce il primo argomento, a meno che non sia null o vuoto. Se il primo argomento è null o vuoto, la funzione restituisce il secondo argomento.

Nell'esempio seguente viene illustrato come viene usata questa funzione.

<Project>

    <PropertyGroup>
        <Value1>$([MSBuild]::ValueOrDefault('$(UndefinedValue)', 'a'))</Value1>
        <Value2>$([MSBuild]::ValueOrDefault('b', '$(Value1)'))</Value2>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
    </Target>
</Project>

<!--
Output:
  Value1 = a
  Value2 = b
-->

Funzioni TargetFramework e TargetPlatform di MSBuild

MSBuild 16.7 e versioni successive definiscono diverse funzioni per la gestione delle proprietà TargetFramework e TargetPlatform.

Firma della funzione Descrizione
FilterTargetFrameworks(string incoming, string filter) Restituisce l'elenco dei framework di destinazione che corrispondono al filtro specificato. Un framework di destinazione da incoming viene mantenuto se corrisponde a uno dei framework di destinazione desiderati in filter.
GetTargetFrameworkIdentifier(string targetFramework) Analizzare il TargetFrameworkIdentifier da TargetFramework.
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) Analizzare la TargetFrameworkVersion dal TargetFramework.
GetTargetPlatformIdentifier(string targetFramework) Analizzare il TargetPlatformIdentifier dal TargetFramework.
GetTargetPlatformVersion(string targetFramework, int versionPartCount) Analizzare il TargetPlatformVersion dal TargetFramework.
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) Restituisce vero se il framework di destinazione candidato (secondo argomento) è compatibile con il framework di destinazione indicato dal primo argomento e falso in caso contrario.

Il versionPartCount parametro di GetTargetFrameworkVersion e GetTargetPlatformVersion ha un valore predefinito pari a 2.

Nell'esempio seguente viene illustrato come vengono usate queste funzioni.

<Project>

    <PropertyGroup>
        <Value1>$([MSBuild]::GetTargetFrameworkIdentifier('net5.0-windows7.0'))</Value1>
        <Value2>$([MSBuild]::GetTargetFrameworkVersion('net5.0-windows7.0'))</Value2>
        <Value3>$([MSBuild]::GetTargetPlatformIdentifier('net5.0-windows7.0'))</Value3>
        <Value4>$([MSBuild]::GetTargetPlatformVersion('net5.0-windows7.0'))</Value4>
        <Value5>$([MSBuild]::IsTargetFrameworkCompatible('net5.0-windows', 'net5.0'))</Value5>
        <Value6>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net6.0'))</Value6>
        <Value7>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net8.0'))</Value7>
        <Value8>$([MSBuild]::IsTargetFrameworkCompatible('net8.0', 'net6.0'))</Value8>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
        <Message Text="Value3 = $(Value3)" />
        <Message Text="Value4 = $(Value4)" />
        <Message Text="Value5 = $(Value5)" />
        <Message Text="Value6 = $(Value6)" />
        <Message Text="Value7 = $(Value7)" />
        <Message Text="Value8 = $(Value8)" />
    </Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False
Value8 = True

MSBuild FilterTargetFrameworks

Con MSBuild 17.6 e versioni successive (o .NET 7 e versioni successive), è possibile usare la funzione di proprietà per selezionare un sottoinsieme di un elenco di Moniker del Framework di Destinazione (TFMs), per limitare l'elenco a quei framework che corrispondono all'elenco di TFMs fornito secondo l'argomento del filtro.

Ad esempio, se incoming è net6.0;net7.0;netstandard2.0 e filter è net7.0;netstandard2.0, il risultato è net7.0;netstandard2.0.

Funzioni di confronto delle versioni di MSBuild

MSBuild 16.5 e versioni successive definiscono diverse funzioni per confrontare le stringhe che rappresentano le versioni.

Annotazioni

Gli operatori di confronto in condizioni sono in grado di comparare stringhe che possono essere interpretate come System.Version oggetti, ma il confronto può produrre risultati imprevisti. Preferisci le funzioni di proprietà.

Firma della funzione Descrizione
VersionEquals(string a, string b) Restituisce true se le versioni a e b sono equivalenti in base alle regole seguenti.
VersionGreaterThan(string a, string b) Restituisce true se la versione a è maggiore di b in base alle regole seguenti.
VersionGreaterThanOrEquals(string a, string b) Restituisce true se la versione a è maggiore o uguale a b in base alle regole seguenti.
VersionLessThan(string a, string b) Restituisce true se la versione a è minore di b in base alle regole seguenti.
VersionLessThanOrEquals(string a, string b) Restituisce true se la versione a è minore o uguale a b in base alle regole seguenti.
VersionNotEquals(string a, string b) Restituisce false se le versioni a e b sono equivalenti in base alle regole seguenti.

In questi metodi, le versioni vengono analizzate come System.Version, con le eccezioni seguenti:

  • L'aggiunta v o V viene ignorata, il che consente il confronto con $(TargetFrameworkVersion).

  • Tutti gli elementi dal primo '-' o '+' alla fine della stringa di versione vengono ignorati. Ciò consente il passaggio di versioni semantiche (semver), anche se l'ordine non è uguale a semver. Gli identificatori di versione preliminare e i metadati di compilazione non hanno invece alcun peso di ordinamento. Questo può essere utile, ad esempio, per attivare una funzionalità per >= x.y e far sì che venga attivato su x.y.z-pre.

  • Le parti non specificate sono uguali a zero parti di valore. (x == x.0 == x.0.0 == x.0.0.0)

  • Gli spazi vuoti non sono consentiti nei componenti integer.

  • Solo la versione principale è valida (3 è uguale a 3.0.0.0)

  • + non è consentito come segno positivo nei componenti interi (viene considerato come metadati semver e ignorato)

Suggerimento

I confronti delle proprietà TargetFramework devono in genere usare IsTargetFrameworkCompatible anziché estrarre e confrontare le versioni. In questo modo è possibile confrontare gli elementi TargetFramework che variano in TargetFrameworkIdentifier e la versione.

Funzioni di condizione DI MSBuild

Le funzioni Exists e HasTrailingSlash non sono funzioni di proprietà. Sono disponibili per l'uso con l'attributo Condition . Consultare le condizioni di MSBuild .