- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用设置项目来发布我的项目。我希望每个项目的版本与设置版本相同。
我想在 Visual Studio 中更改我的设置版本属性,并且在构建之后,要从该属性更新所有项目版本,这可能吗?
最佳答案
项目有程序集和文件版本号:(不是设置版本我相应地编辑了你的问题)
答案 1:
如果您想设置安装项目版本号,您需要使用由构建触发的脚本/exe 来设置程序集和文件版本号。
这篇文章 How To Update Assembly Version Number Automatically显示一半的解决方案...
根据我所做的研究,不可能在 PreBuildEvent 中使用 SetupVersion。它没有 $SetupVersion 命令:http://msdn.microsoft.com/en-us/library/42x5kfw4(v=vs.80).aspx
每次构建都必须更改 PreBuildEvent,如 this comment 中所示在代码项目文章中使用 -set:
命令并不理想。
我们需要的解决方案是调用 AssemblyInfoUtil.exe 的 PreBuildEvent 并让它从 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
<path to :Setup.vdproj file> and <path to AssemblyInfo.cs or AssemblyInfo.vb file> [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, "<Assembly: AssemblyVersion(\"");
line = ProcessLinePart(line, "<Assembly: AssemblyFileVersion(\"");
}
else {
line = ProcessLinePart(line, "[assembly: AssemblyVersion(\"");
line = ProcessLinePart(line, "[assembly: AssemblyFileVersion(\"");
}
return line;
}
private static string ProcessLinePart(string line, string part) {
int spos = line.IndexOf(part);
if (spos >= 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 类文件。
要实现这一点,请在名为 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 (i.e. Retail) builds;
// for example, through the file properties window.
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Flavor=Debug")] // a.k.a. "Comments"
#else
[assembly: AssemblyConfiguration("Retail")]
[assembly: AssemblyDescription("Flavor=Retail")] // a.k.a. "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
// <bindingRedirect> 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")] // a.k.a. "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")]
因此,每次您想更改所有项目的装配信息时,您都可以在一个地方完成。我假设您希望将 MSI 安装版本设置为与程序集版本号相同,一个手动步骤。
答案 3:
考虑改用 MSBuild它具有所有这些好处,但我不确定您现在是否有时间了解它。
答案 4:
程序集可以使用 AssemblyInfo.cs 中的以下星号语法自动递增其内部版本号:
[assembly: AssemblyVersion("1.0.0.*")]
This is a good method because the point of tracking a build number is to be able to recognize different builds. Having a pre-build changing build numbers defeats this purpose as the build has not yet occurred.
答案 5:
其他CodeProject此处的回答假定您要更新安装 MSI 项目文件中的 ProductVersion、ProductCode、PackageCode
。我没有那样解释你的问题,根据这个线程有问题: pre-build event to change setup project's ProductVersion doesn't take effect until after the build
答案 6(新):
有几个 TFS Build 插件可以设置“Assembly Info”: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
关于c# - 使用 MSI 安装版本设置 AssemblyInfo 版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15222243/
我有多个项目的解决方案。我想单独更新每个项目中的 AssemblyInfo.cs 文件。文件中的大部分信息都是相同的,但可能有一两处我想要不同。我一直无法找到一种方法来使用 Albacore asse
每次我为WPF创建一个新项目时,都会生成一个n Assembly Info.cs,但有几个“CS1010 Newline in Constant”错误。我每次都要去文件里手动编辑它们。我想永久解决这个
我在 AssemblyInfo.cs 中有以下代码: [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("1.0.
我正在使用 subversion 维护一个(主要是)C# 代码的应用程序。我想知道何时何地更新 AssemblyInfo.cs 文件以反射(reflect)产品发布时的版本号的最佳做法是什么。 假设我
其中包含多个项目的 NET 3.5 解决方案。有没有一种方法可以创建一个“全局”AssemblyInfo.cs,其中所有项目 AssemblyInfo.cs 都可以从中引用? 最佳答案 在解决方案根目
有没有办法在不将类加载到 AppDomain 的情况下以编程方式(在 C# 中)获取程序集信息(名称、描述、版本)?我只需要 list 中的信息,别无其他。Assembly.ReflectionOnl
我想向 AssemblyInfo 添加自定义属性,并且我创建了一个名为 AssemblyMyCustomAttribute 的扩展类 [AttributeUsage(AttributeTargets.
它在 C# 项目的 AssemblyInfo.cs 中说可以使用 * 指定版本信息 // Version information for an assembly consists of the fol
是否有可能通过 DateTime.Now.Year 在 AssemblyInfo.cs 文件中包含当前年份? 我试过了: [assembly: AssemblyCopyright("Copyright
我的问题非常基本:AssemblyInfo.cs 文件的用途是什么? 最佳答案 AssemblyInfo.cs contains information about your assembly, li
我有一个具有自定义构建步骤的构建,该步骤从存储库中读取文本文件并写入 build.version 配置参数。我正在尝试在这样的 AssemblyInfo 修补程序中使用该值:%build.versio
我正在 Visual Studio 中创建一个项目模板,我想让 AssemblyInfo.cs 文件更通用一些。我在我的项目中多次需要这些值,它们已在 Resources.resx 下定义。有什么方法
我们已将 #pragma warning disable 添加到所有 AssemblyInfo.cs 文件的顶部。不过,Visual Studio 2015 专业版中的内置代码分析会继续分析该文件。我
我有一个数据库表,用于存储窗口的高度、宽度、状态等。作为窗口的标识符,我使用表单的完整类型名称。它运作良好,但我发现一些通用形式的名称非常长。原因是通用类型列出了完整的程序集信息。有办法跳过吗? 例如
我的 AssemblyInfo 包含有关我的产品、公司等的信息。此数据当前硬编码在 cs 文件中: [assembly: AssemblyCompany("My Company.")] [assemb
默认的 AssemblyInfo.cs 如下所示: using System.Reflection; using System.Runtime.CompilerServices; using Syst
鉴于 Blah.dll 的 AssemblyInfo.cs 中的这段代码: [assembly: AssemblyVersion("3.3.3.3")] [assembly: AssemblyFile
我读过这个技术:Shared assembly info in VS projects - JJameson's blog 基本上这意味着创建一个包含有关程序集的版本信息的 SharedAssembl
我创建了一个适合我需要的 TeamCity 构建配置,请参阅下面的构建日志: 除了一件事之外,一切都很好 - 自定义版本号 .我的版本号格式如下: Major.Minor.BuildCounter.T
我曾经让 TeamCity + WiX + MSBuild 社区任务工作。现在我已经升级到 WiX 3.5,我不记得我是如何配置它的。 :) 当我浏览 TeamCity 时,我遇到了“Assembly
我是一名优秀的程序员,十分优秀!