問題描述
如何讀取 AssemblyFileVersion 或其組件 AssemblyFileMajorVersion、AssemblyFileMinorVersion、AssemblyFileBuildNumber、AssemblyFileRevision,在 .csproj 中,編譯后?
How can one read the AssemblyFileVersion, or its components AssemblyFileMajorVersion, AssemblyFileMinorVersion, AssemblyFileBuildNumber, AssemblyFileRevision, within the .csproj, following compilation?
我嘗試了以下從構建的程序集中提取信息的方法:
I have tried the following which pulls the information from the built assembly:
<Target Name="AfterCompile">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output
TaskParameter="Assemblies"
ItemName="MyAssemblyIdentities"/>
</GetAssemblyIdentity>
<Message Text="AssemblyVersion = %(MyAssemblyIdentities.Version)" />
</Target>
但這會檢索 AssemblyVersion 而不是 AssemblyFileVersion.后者似乎沒有記錄在案的元數據條目.我也試過了:
But that retrieves the AssemblyVersion and not the AssemblyFileVersion. There does not seem to be a documented metadata entry for the latter. I also tried:
<Import Project="$(MSBuildExtensionsPath)ExtensionPackMSBuild.ExtensionPack.tasks" />
<Target Name="AfterCompile">
<MSBuild.ExtensionPack.Framework.Assembly TaskAction="GetInfo" NetAssembly="$(TargetPath)">
<Output TaskParameter="OutputItems" ItemName="Info" />
</MSBuild.ExtensionPack.Framework.Assembly>
<Message Text="AssemblyFileVersion = %(Info.FileVersion)" />
</Target>
不幸的是,雖然這會檢索到正確的值,但它也會文件鎖定程序集,直到 VS2008 關閉.
Unfortunately, while this retrieves the correct value, it also file locks the assembly until VS2008 is closed.
坦率地說,這也不是我想要的,因為我寧愿直接從 AssemblyInfo.cs 中讀取信息.但是,我無法弄清楚如何做到這一點.我認為 MSBuild Extensions 中的 AssemblyInfo 是一種方式,但它似乎專注于寫入 AssemblyInfo 而不是從中檢索值.
Frankly, neither is what I want as I would rather read the information from the AssemblyInfo.cs directly. However, I cannot figure out how to do that. I assumed AssemblyInfo in the MSBuild Extensions was one way, but it seems focused on writing to the AssemblyInfo and not retrieving values from it.
我怎樣才能最好地做到這一點?
How can I best accomplish this?
推薦答案
我已經設法使用自定義任務解決了這個問題.類庫 DLL 就是這樣(為簡潔起見調整/刪除了一些代碼):
I've managed to solve this using a custom task. The class library DLL is as so (some code adjusted/eliminated for brevity):
using System;
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.Build.Framework;
namespace GetAssemblyFileVersion
{
public class GetAssemblyFileVersion : ITask
{
[Required]
public string strFilePathAssemblyInfo { get; set; }
[Output]
public string strAssemblyFileVersion { get; set; }
public bool Execute()
{
StreamReader streamreaderAssemblyInfo = null;
Match matchVersion;
Group groupVersion;
string strLine;
strAssemblyFileVersion = String.Empty;
try
{
streamreaderAssemblyInfo = new StreamReader(strFilePathAssemblyInfo);
while ((strLine = streamreaderAssemblyInfo.ReadLine()) != null)
{
matchVersion = Regex.Match(strLine, @"(?:AssemblyFileVersion("")(?<ver>(d*).(d*)(.(d*)(.(d*))?)?)(?:""))", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
if (matchVersion.Success)
{
groupVersion = matchVersion.Groups["ver"];
if ((groupVersion.Success) && (!String.IsNullOrEmpty(groupVersion.Value)))
{
strAssemblyFileVersion = groupVersion.Value;
break;
}
}
}
}
catch (Exception e)
{
BuildMessageEventArgs args = new BuildMessageEventArgs(e.Message, string.Empty, "GetAssemblyFileVersion", MessageImportance.High);
BuildEngine.LogMessageEvent(args);
}
finally { if (streamreaderAssemblyInfo != null) streamreaderAssemblyInfo.Close(); }
return (true);
}
public IBuildEngine BuildEngine { get; set; }
public ITaskHost HostObject { get; set; }
}
}
并且在項目文件中:
<UsingTask AssemblyFile="GetAssemblyFileVersion.dll" TaskName="GetAssemblyFileVersion.GetAssemblyFileVersion" />
<Target Name="AfterCompile">
<GetAssemblyFileVersion strFilePathAssemblyInfo="$(SolutionDir)AssemblyInfo.cs">
<Output TaskParameter="strAssemblyFileVersion" PropertyName="strAssemblyFileVersion" />
</GetAssemblyFileVersion>
<Message Text="AssemblyFileVersion = $(strAssemblyFileVersion)" />
</Target>
我已經對此進行了測試,如果您使用 MSBuild.ExtensionPack.VersionNumber.targets 進行自動版本控制,它將讀取更新的版本.
I've tested this and it will read the updated version if you use MSBuild.ExtensionPack.VersionNumber.targets for auto-versioning.
顯然,這可以很容易地擴展,以便將正則表達式從項目文件傳遞到更通用的自定義任務,以獲得任何文件中的任何匹配.
2009/09/03 更新:
Obviously, this could be easily extended so that a regex is passed from the project file to a more general-purpose custom task in order to obtain any match in any file.
Update 2009/09/03:
必須進行一項額外的更改才能在每次構建時更新 ApplicationVersion
.InitialTargets="AfterCompile"
必須添加到 <Project...
.這是郭超解決的.
One additional change has to be made to make the ApplicationVersion
update on each build. InitialTargets="AfterCompile"
must be added to the <Project...
. This was solved by Chao Kuo.
這篇關于從 AssemblyInfo 后編譯讀取 AssemblyFileVersion的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!