使用MSI安装版本设置AssemblyInfo版本号

我正在使用安装项目来发布我的项目。 我希望每个项目的版本与安装版本相同。

我想在Visual Studio中更改我的安装版本属性,并且在构建之后,对于要从此属性更新的所有项目版本,这可能吗?

项目有汇编和文件版本号:(不是我相应编辑你的问题的安装版本) 在此处输入图像描述

答案1:

如果要使安装项目版本号设置为程序集和文件版本号,则需要使用由构建触发的脚本/ exe来执行此操作。

在此处输入图像描述

这篇关于如何更新汇编版本号的文章自动显示了解决方案的一半……

从我做的研究中,不可能在PreBuildEvent中使用SetupVersion。 它没有$ SetupVersion命令: http : //msdn.microsoft.com/en-us/library/42x5kfw4( v = vs。80) .aspx

必须使用-set:命令更改代码项目文章中此注释中显示的每个构建的PreBuildEvent并不理想。

我们需要的解决方案是PreBuildEvent来调用AssemblyInfoUtil.exe并让它从vdproj项目文件中读取“ProductVersion”。 然后更新程序集版本号。

我修改了文章中的代码,向您展示如何从Setup.vdproj中读取产品版本,这是从PreBuildEvent调用它的方法:

 AssemblyInfoUtil.exe -setup:"C:\Program Files\MyProject1\Setup1\Setup1.vdproj" -ass:"C:\Program Files\MyProject1\AssemblyInfo.cs" 

这是修改后的代码:

 using System; using System.IO; using System.Text; namespace AssemblyInfoUtil { class AssemblyInfoUtil { private static int incParamNum = 0; private static string fileName = ""; private static string setupfileName = ""; private static string versionStr = null; private static bool isVB = false; [STAThread] static void Main(string[] args) { for (int i = 0; i < args.Length; i++) { if (args[i].StartsWith("-setup:")) { string s = args[i].Substring("-setup:".Length); setupfileName = int.Parse(s); } else if (args[i].StartsWith("-ass:")) { fileName = args[i].Substring("-ass:".Length); } } //Jeremy Thompson showing how to detect "ProductVersion" = "8:1.0.0" in vdproj string setupproj = System.IO.File.ReadAllText(setupfileName); int startPosOfProductVersion = setupproj.IndexOf("\"ProductVersion\" = \"") +20; int endPosOfProductVersion = setupproj.IndexOf(Environment.NewLine, startPosOfProductVersion) - startPosOfProductVersion; string versionStr = setupproj.Substring(startPosOfProductVersion, endPosOfProductVersion); versionStr = versionStr.Replace("\"", string.Empty).Replace("8:",string.Empty); if (Path.GetExtension(fileName).ToLower() == ".vb") isVB = true; if (fileName == "") { System.Console.WriteLine("Usage: AssemblyInfoUtil  and  [options]"); System.Console.WriteLine("Options: "); System.Console.WriteLine(" -setup:Setup.vdproj file path"); System.Console.WriteLine(" -ass:Assembly file path"); return; } if (!File.Exists(fileName)) { System.Console.WriteLine ("Error: Can not find file \"" + fileName + "\""); return; } System.Console.Write("Processing \"" + fileName + "\"..."); StreamReader reader = new StreamReader(fileName); StreamWriter writer = new StreamWriter(fileName + ".out"); String line; while ((line = reader.ReadLine()) != null) { line = ProcessLine(line); writer.WriteLine(line); } reader.Close(); writer.Close(); File.Delete(fileName); File.Move(fileName + ".out", fileName); System.Console.WriteLine("Done!"); } private static string ProcessLine(string line) { if (isVB) { line = ProcessLinePart(line, "= 0) { spos += part.Length; int epos = line.IndexOf('"', spos); string oldVersion = line.Substring(spos, epos - spos); string newVersion = ""; bool performChange = false; if (incParamNum > 0) { string[] nums = oldVersion.Split('.'); if (nums.Length >= incParamNum && nums[incParamNum - 1] != "*") { Int64 val = Int64.Parse(nums[incParamNum - 1]); val++; nums[incParamNum - 1] = val.ToString(); newVersion = nums[0]; for (int i = 1; i < nums.Length; i++) { newVersion += "." + nums[i]; } performChange = true; } } else if (versionStr != null) { newVersion = versionStr; performChange = true; } if (performChange) { StringBuilder str = new StringBuilder(line); str.Remove(spos, epos - spos); str.Insert(spos, newVersion); line = str.ToString(); } } return line; } } } 

答案2:

根据我的思维方式,更好的方法是使用Shared Assembly Info类而不是单独的AssemblyInfo类文件。

要实现此function,请在名为SharedAssemblyInfo.cs的解决方案文件夹中创建一个文件,然后在每个项目中将链接添加到SharedAssemblyInfo.cs。 您还可以将链接的SharedAssemblyInfo.cs移动到Properties文件夹中,以便它与特定于解决方案中每个项目的AssemblyInfo.cs并排放置,如下所示。

在此处输入图像描述

这是一个SharedAssemblyInfo.cs文件示例:

 using System; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyCompany("Saint Bart Technologies")] [assembly: AssemblyProduct("Demo")] [assembly: AssemblyCopyright("Copyright ? Saint Bart 2013")] [assembly: AssemblyTrademark("")] // Make it easy to distinguish Debug and Release (ie Retail) builds; // for example, through the file properties window. #if DEBUG [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Flavor=Debug")] // aka "Comments" #else [assembly: AssemblyConfiguration("Retail")] [assembly: AssemblyDescription("Flavor=Retail")] // aka "Comments" #endif [assembly: CLSCompliant(true)] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // Note that the assembly version does not get incremented for every build // to avoid problems with assembly binding (or requiring a policy or //  in the config file). // // The AssemblyFileVersionAttribute is incremented with every build in order // to distinguish one build from another. AssemblyFileVersion is specified // in AssemblyVersionInfo.cs so that it can be easily incremented by the // automated build process. [assembly: AssemblyVersion("1.0.0.0")] // By default, the "Product version" shown in the file properties window is // the same as the value specified for AssemblyFileVersionAttribute. // Set AssemblyInformationalVersionAttribute to be the same as // AssemblyVersionAttribute so that the "Product version" in the file // properties window matches the version displayed in the GAC shell extension. [assembly: AssemblyInformationalVersion("1.0.0.0")] // aka "Product version" 

这是一个AssemblyInfo.cs文件示例:

 // Note: Shared assembly information is specified in SharedAssemblyInfo.cs using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("WindowsFormsApplication2")] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("ffded14d-6c95-440b-a45d-e1f502476539")] 

因此,每次您想要更改所有项目assembly信息时,您都可以在一个位置完成。 我假设你想要设置MSI安装版本与程序集版本号相同,只需一个手动步骤。


答案3:

考虑切换到使用MSBuild它有所有这些好处,但我不确定你是否有时间立即拿起它。


答案4:

程序集可以使用AssemblyInfo.cs中的以下星号语法自动增加其构建号:

 [assembly: AssemblyVersion("1.0.0.*")] 

这是一种很好的方法,因为跟踪构建号码的目的是能够识别不同的构建。 由于构建尚未发生,因此预构建更改构建数会失败此目的。


答案5:

此处的其他CodeProject答案假定您要更新Setup MSI Project文件中的ProductVersion, ProductCode, PackageCode 。 我没有按照这种方式解释你的问题,并且根据这个post存在问题: 更改安装项目的预构建事件的ProductVersion直到构建之后才生效

答案6(新):

有一些TFS Build插件可以设置“程序集信息”: https : //marketplace.visualstudio.com/items ? itemName =bleddynrichards.Assembly- Info- Task https://marketplace.visualstudio.com/items?itemName=bool .update-assembly-info https://marketplace.visualstudio.com/items?itemName=ggarbuglia.setassemblyversion-task

我不知道这是否能完美地解决你的问题,但你可以用所有的配置信息实现一个公共类,如:

 public class VersionInfo{ public const string cProductVersion = "1.0.0" //other version info } 

在您使用新类更新所有AssemblyInfo.cs之后:

 [assembly: AssemblyVersion(VersionInfo.cProductVersion)] 

我希望这有帮助。