Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
BÅDE MSBuild-egenskaper och -objekt används för att skicka information till aktiviteter, utvärdera villkor och lagra värden som kan refereras i hela projektfilen.
Egenskaper är namn/värde-par. Mer information finns i MSBuild-egenskaper.
Objekt är objekt som vanligtvis representerar filer. Objektobjekt kan ha associerade metadatasamlingar. Metadata är namn/värde-par. Mer information finns i Objekt.
Skalärer och vektorer
Eftersom MSBuild-egenskaper är namn/värde-par som bara har ett strängvärde, beskrivs de ofta som skalära. Eftersom MSBuild-objekttyper är listor över objekt beskrivs de ofta som vektorer. I praktiken kan dock egenskaper representera flera värden, och objekttyper kan ha noll eller ett objekt.
Målberoendeinmatning
Om du vill se hur egenskaper kan representera flera värden bör du överväga ett vanligt användningsmönster för att lägga till ett mål i en lista över mål som ska skapas. Den här listan representeras vanligtvis av ett egenskapsvärde, där målnamnen avgränsas med semikolon.
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Egenskapen BuildDependsOn används vanligtvis som argument för ett målattribut DependsOnTargets och konverterar den effektivt till en objektlista. Den här egenskapen kan åsidosättas för att lägga till ett mål eller för att ändra målkörningsordningen. Ett exempel:
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
CustomBuild;
</BuildDependsOn>
</PropertyGroup>
lägger till CustomBuild-målet i mållistan, vilket ger BuildDependsOn värdet BeforeBuild;CoreBuild;AfterBuild;CustomBuild.
Från och med MSBuild 4.0 är målberoendeinmatningen inaktuell. Använd attributen AfterTargets och BeforeTargets i stället. Mer information finns i Målversionsordning.
Konverteringar mellan strängar och objektlistor
MSBuild utför konverteringar till och från objekttyper och strängvärden efter behov. Om du vill se hur en objektlista kan bli ett strängvärde bör du tänka på vad som händer när en objekttyp används som värde för en MSBuild-egenskap:
<ItemGroup>
<OutputDir Include="KeyFiles\;Certificates\" />
</ItemGroup>
<PropertyGroup>
<OutputDirList>@(OutputDir)</OutputDirList>
</PropertyGroup>
Objekttypen OutputDir har ett Include attribut med värdet "KeyFiles\; Certifikat\". MSBuild parsar den här strängen i två objekt: KeyFiles\ och Certificates\. När objekttypen OutputDir används som värde för egenskapen OutputDirList konverterar MSBuild eller "plattar ut" objekttypen till den semikolonavgränsade strängen "KeyFiles\; Certifikat\".
Egenskaper och objekt i aktiviteter
Egenskaper och objekt används som indata och utdata till MSBuild-uppgifter. Mer information finns i Uppgifter.
Egenskaper skickas till aktiviteter som attribut. I aktiviteten representeras en MSBuild-egenskap av en egenskapstyp vars värde kan konverteras till och från en sträng. De egenskapstyper som stöds är bool, char, DateTime, Decimal, Double, int, stringoch alla typer som ChangeType kan hantera.
Objekt skickas till aktiviteter som ITaskItem objekt. I aktiviteten ItemSpec representerar värdet för objektet och GetMetadata hämtar dess metadata.
Objektlistan för en objekttyp kan skickas som en matris med ITaskItem objekt. Objekt kan tas bort från en objektlista i ett mål med hjälp av attributet Remove . Eftersom objekt kan tas bort från en objektlista är det möjligt att en objekttyp har noll objekt. Om en objektlista skickas till en aktivitet bör koden i aktiviteten söka efter den här möjligheten.
Utvärderingsordning för egenskap och objekt
Under utvärderingsfasen av en version införlivas importerade filer i bygget i den ordning de visas. Egenskaper och objekt definieras i tre pass i följande ordning:
Egenskaper definieras och ändras i den ordning de visas.
Objektdefinitioner definieras och ändras i den ordning de visas.
Objekt definieras och ändras i den ordning de visas.
Under körningsfasen av en version utvärderas egenskaper och objekt som definieras inom målen tillsammans i en enda fas i den ordning de visas.
Detta är dock inte hela historien. När en egenskap, en objektdefinition eller ett objekt har definierats utvärderas dess värde. Uttrycksutvärderingen expanderar strängen som anger värdet. Strängexpansionen är beroende av byggfasen. Här är en mer detaljerad utvärderingsordning för egenskaper och objekt:
Under utvärderingsfasen av ett bygge:
Egenskaper definieras och ändras i den ordning de visas. Egenskapsfunktioner körs. Egenskapsvärden i formuläret $(PropertyName) expanderas i uttryck. Egenskapsvärdet är inställt på det expanderade uttrycket.
Objektdefinitioner definieras och ändras i den ordning de visas. Egenskapsfunktioner har redan expanderats i uttryck. Metadatavärden är inställda på de expanderade uttrycken.
Objekttyper definieras och ändras i den ordning de visas. Objektvärden i formuläret @(ItemType) expanderas. Objekttransformeringar expanderas också. Egenskapsfunktioner och -värden har redan expanderats i uttryck. Objektlistan och metadatavärdena är inställda på de expanderade uttrycken.
Under körningsfasen av en version:
- Egenskaper och objekt som definieras i mål utvärderas tillsammans i den ordning de visas. Egenskapsfunktioner körs och egenskapsvärden expanderas i uttryck. Objektvärden och objekttransformeringar expanderas också. Egenskapsvärdena, objekttypsvärdena och metadatavärdena anges till de expanderade uttrycken.
Subtila effekter av utvärderingsordningen
I utvärderingsfasen av en version föregår egenskapsutvärdering objektutvärdering. Egenskaper kan dock ha värden som verkar vara beroende av objektvärden. Överväg följande skript.
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Target Name="AfterBuild">
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
När du kör meddelandeaktiviteten visas följande meddelande:
KeyFileVersion: 1.0.0.3
Det beror på att värdet KeyFileVersion för faktiskt är strängen "@(KeyFile->'%(version)')". Objekt- och objekttransformeringar expanderades inte när egenskapen först definierades, så KeyFileVersion egenskapen tilldelades värdet för den oexpanderade strängen.
Under körningsfasen av bygget expanderar MSBuild strängen "@(KeyFile->'%(version)') när den bearbetar meddelandeaktiviteten och ger "1.0.0.3".
Observera att samma meddelande skulle visas även om egenskapen och objektgrupperna var omvända i ordning.
Som ett andra exempel bör du tänka på vad som kan hända när egenskaps- och objektgrupper finns inom mål:
<Target Name="AfterBuild">
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
Meddelandeaktiviteten visar det här meddelandet:
KeyFileVersion:
Detta beror på att under körningsfasen av bygget utvärderas egenskaps- och objektgrupper som definierats i mål uppifrån och ned samtidigt. När KeyFileVersion har definierats KeyFile är okänt. Därför expanderas objekttransformeringen till en tom sträng.
Om du i det här fallet återställer ordningen för egenskapen och objektgrupperna återställs det ursprungliga meddelandet:
<Target Name="AfterBuild">
<ItemGroup>
<KeyFile Include="KeyFile.cs">
<Version>1.0.0.3</Version>
</KeyFile>
</ItemGroup>
<PropertyGroup>
<KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>
Värdet KeyFileVersion för är inställt på "1.0.0.3" och inte på "@(KeyFile->'%(version)')". Meddelandeaktiviteten visar det här meddelandet:
KeyFileVersion: 1.0.0.3