Here how I define variable in my bundle project:
<Variable Name="MyPackageVersion" Type="version" Value="!(bind.packageVersion.MyPackage)"/>
<ExePackage Id="MyPackage" SourceFile="MyPackage.exe" ...=""/>
I've traced Binder.BindBundle (light.exe) execution and find out that below code of that method populates that variable with file version of MyPackage.exe:
// Resolve any delayed fields before generating the manifest.
if (0 < delayedFields.Count)
{
this.ResolveDelayedFields(bundle, delayedFields, variableCache, null);
}
But I didn't see any usage of delayedFields local variable in remaining code of that method.
BurnManifest from final executable contains orignial value as no resolving took place:
<Variable Id="EmbeddedBuildProcessorSystem" Value="!(bind.packageVersion.MyPackageVersion)" Type="version" Hidden="no" Persisted="no"/>
Here are pieces from bundle project:
Variable
Name="MyPackageVersion"
Type="version"
Value="!(bind.packageVersion.MyPackage)"
ExePackage
Id="MyPackage"
SourceFile="MyPackage.exe"
...
And this piece was extracted from BurnManifest of produced EXE:
Variable Id="MyPackageVersion" Value="!(bind.packageVersion.MyPackageVersion)" Type="version" Hidden="no" Persisted="no"