2013-03-05 23 views
9

私はプロジェクトを公開するためにセットアッププロジェクトを使用しています。私は、各プロジェクトのバージョンをセットアップバージョンと同じにします。AssemblyInfo MSIセットアップバージョンのバージョン番号を設定

Visual Studioでセットアップバージョンプロパティを変更したいのですが、ビルド後にこのプロパティからすべてのプロジェクトバージョンを更新することは可能ですか?

+1

「セットアップバージョン」とは何ですか? –

+0

@SimonMourierも私を最初に混乱させました。その2番目のスクリーンショットは私の答えに示されています。 –

+0

ああ、セットアッププロジェクトのこの「バージョン」プロパティは、わかっている限り、最終的なMSIファイルには書かれていないので、何がポイントですか? –

答えて

26

プロジェクトは、国会&ファイルのバージョン番号があります(私はそれに応じてあなたの質問を編集しないで、セットアップのバージョン) enter image description here

回答1:

あなたは国会設定セットアッププロジェクトのバージョン番号を作りたい場合&ビルドによってトリガされるスクリプト/ exeでファイルのバージョン番号を指定する必要があります。

enter image description here

How To Update Assembly Version Number Automatically上のこの記事では、半分の解決策を示しています...私はそれをやった研究から、

はPreBuildEventでSetupVersionを使用することはできません。 -set:コマンドを使用してコードプロジェクトの記事にthis commentに示すように、それぞれが構築PreBuildEventを変更することhttp://msdn.microsoft.com/en-us/library/42x5kfw4(v=vs.80).aspx

が理想的ではありません:それのための$ SetupVersionコマンドがありません。

私たちが必要とするソリューションは、AssemblyInfoUtil.exeを呼び出し、vdprojプロジェクトファイルから "ProductVersion"を読み込むPreBuildEventです。アセンブリのバージョン番号を更新します。

私は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:

自分の考え方では、個々のAssemblyInfoクラスファイルではなく、Shared Assembly Infoクラスを使用することをお勧めします。

これを実装するには、ソリューションフォルダSharedAssemblyInfo.csにファイルを作成し、各プロジェクトにリンクをSharedAssemblyInfo.csに追加します。リンクされたSharedAssemblyInfo.csをPropertiesフォルダに移動して、AssemblyInfoと並んで配置することもできます。以下に示すように、ソリューション内の各プロジェクトに固有のcsです。ここで

enter image description here

サンプル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")] 

あなたはすべてのプロジェクトを変更したいので、その都度あなたは1つの場所でそれを行うことができますアセンブリ情報。 MSIセットアップバージョンをアセンブリバージョン番号と同じ1つの手動ステップに設定すると仮定します。


回答3:

MSBuildを使用するように切り替えることを検討し、それは利点のすべてのこれらの種類を持っているが、私はあなたが今、それを拾うために時間を持っているかはわかりません。


回答4:

アセンブリAssemblyInfo.cs内の次のアスタリスク構文を使用して自動インクリメント彼らのビルド番号次のことができますので、

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

これは良い方法であり、異なるビルドを認識できるように、ビルド番号を追跡するポイントは です。ビルドがまだ行われていないため、ビルド番号を変更するとビルド番号が無効になります。


回答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は、「アセンブリ情報」を設定するプラグインをビルドしますがあります: 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

+0

Answer 1のコードサンプルで問題が見つかりました。SetupfileName(コンパイルエラー)の引数を解析する必要はありません。また、versionStrをローカル変数として再宣言するべきではありません。エラー!)。 –

1

これは完全にあなたの問題を解決するかどうか、私は知りませんが、あなたのようなすべてのconfigmanagmentの情報と共通のクラスを実装することができます:あなたは新しいクラスで、すべてのAssemblyInfo.csを更新することができた後

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

[assembly: AssemblyVersion(VersionInfo.cProductVersion)] 

これが役立ちます。

+0

これを行う正式な方法は私の#2答えを参照してください。良いです。 –

+0

ヒントのためのthx、私はあなたの解決の後に私自身のプロジェクト設定を変更します – yaens

関連する問題