我在Visual Studio 2010解決方案中有許多Visual C++項目。在這個解決方案中還有一個WiX項目,它爲C++項目之一的產品構建可執行文件的安裝程序。在MSBuild中獲取本機exe的文件版本
可執行文件的項目中有一個資源文件,該文件將程序的版本寫入可執行文件。
現在我想用與由資源文件寫入可執行文件的編號相同的編號來編譯WiX構建的安裝程序。我搜索StackOverflow上的WiX的相關帖子,發現這個帖子:
Referencing a WixVariable defined in a WiX Library Project from a WiX Setup Project
接受的答案到,似乎表明一個可能的解決方案是使用的MSBuild和GetAssemblyIdentity任務在BeforeBuild目標從另一個文件中獲取版本號(在SO問題中爲DLL,在我的情況下爲可執行文件)並在WiX構建安裝程序之前將其公開給WiX。
我嘗試添加這對我.wixproj文件的MSBuild的一部分,但是當我試圖生成安裝程序我得到一個錯誤回話說:
error MSB3441: Cannot get assembly name for "<ExePath>". Could not load file or assembly '<ExeName>.exe' or one of its dependencies. The module was expected to contain an assembly manifest.
我似乎無法找到MSDN的任何信息關於這個錯誤,因爲它涉及MSBuild。我已經檢查過內置的可執行文件,它的版本號(以及.rc文件中的其他信息)以及WiX項目依賴於輸出可執行文件的項目;所以我假設它的BeforeBuild任務在它所依賴的項目完全構建完成後運行。
我是否應該使用不同的任務而不是GetAssemblyIdentity從MSBuild中的.exe中檢索版本號,在GetAssemblyIdentity工作之前是否還有其他需求需要滿足,還是僅僅是無法獲得有關此類信息的信息MSBuild中的.exe文件?
編輯:
我接受Rob的答案,因爲我是誤解的ProductVersion和文件版本,以及WiX的技術,他建議,正在按原計劃,是對我所需要的溶液的步驟之間的差異。
FileVersion只是可執行文件的一個屬性。 Msi文件本質上是數據庫,而ProductVersion是該數據庫中的一個條目;他們沒有FileVersion屬性來設置。他建議的方法在.msi數據庫中正確設置了ProductVersion。
這個問題的標題現在並不真正與我實際存在的問題有關,因爲我當時正在尋求一種我認爲我當時需要的解決方案。我現在已經解決了只能訪問安裝程序的ProductVersion的根本問題。我在這裏發現了一個cscript腳本:http://kentie.net/article/wixnameversion/index.htm顯示瞭如何訪問.msi的ProductVersion。使用它可以讓我提取ProductVersion並在其他工具中使用它。
會使用預處理器擴展來抓取文件版本是不可能的? – Netfangled 2013-04-10 20:57:35
您使用的是什麼版本的WiX工具集? – 2013-04-10 23:27:36
我使用的是版本3.7 – Alex 2013-04-11 00:18:56