﻿# 使用 Visual Studio 安裝專案升級程式必須明確指定組件版本

當你使用 Visual Studio 的「安裝專案」來部署應用程式時，你可能會想利用內建的自動升級功能來替換已安裝的所有檔案或組件，但是針對你每一個被加入到安裝專案的專案，並不見得真的會在安裝時自動更新你以為已經更新的檔案，各專案的 AssemblyInfo.cs 已經要看看是否更新了組件檔案版本編號。

當我們在 Visual Studio 中設定「安裝專案」並修改 Version 版本編號時會提示你是否變更 **ProductCode** 屬性，這時你也會發現 **UpgradeCode** 屬性並不會改變，因為 **ProductCode** 是用來識別該產品是否已被安裝，而 **UpgradeCode** 用來識別是否是同一系列可被升級的產品，若要讓安裝專案自動升級異動的檔案，也必須將 **DetectNewerInstalledVersion** 屬性與 **RemovePreviousVersions** 屬性設定為 True 才行。

   ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4b0431c193a117c07f01-image.png)

而在各專案的 Properties 目錄下都會有個 AssemblyInfo.cs 檔案定義了該組件的各種資訊：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/32d24cec28c1c3e71d2c-image.png)

其中有兩行是關於**組件版本**與**組件檔案版本**的設定，其中與部署更新有關的就是 AssemblyFileVersion 屬性，如果此版本編號不變，該組件在安裝的過程就不會被更新。

```csharp
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
```

但我想應該有不少人因為懶的自己編版本號，所以會採用以下寫法：

```csharp
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]
```

雖然每次編譯出來的 AssemblyVersion 組件編號會自動設定，但是 AssemblyFileVersion 屬性似乎並不是這麼一回事，所以你將 AssemblyFileVersion 屬性設定為 1.0.\* 是沒有作用的，檔案在安裝時並不會自動更新，因此你必須針對 AssemblyFileVersion 屬性設定固定的版本編號，而且在設定產品升級的時候一定要給予不同的版本編號才能讓組件在安裝時自動更新！

**相關連結**

-   [Visual Studio Setup project FAQ](http://social.msdn.microsoft.com/Forums/en/winformssetup/thread/717cfce0-3061-400f-9ea3-069f73f3a473)
-   [關於AssemblyVersion的一點小事](http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/07/30/3395.aspx)
