2013-07-26 76 views
0

我正在使用WIX爲Windows服務創建安裝程序。WIX篡改文件

該服務已準備好安裝(它在項目中定義了一個ServiceInstaller)。因此,如果我使用installutil安裝該服務,它可以很好地工作。

試圖建立一個維克斯安裝程序,我在產品上創建以下組件:

<Component ...> 
    <File Id="ServiceDll" Name="$(var.Scheduler.TargetFileName)" Source="$(var.Scheduler.TargetPath)"/> 
    <File Id="Connector" Name="Connector.dll" Source="$(var.Scheduler.TargetPath)"/> 
    <!-- some more dependencies --> 
    <ServiceInstall Id="InstallService" Name="ScheduleService" Start="auto" Type="ownProcess" ErrorControl="normal"/> 
</Component> 

Scheduler是服務項目的名稱。我從wix項目中添加了對該項目的引用。 Connector.dll是一個.Net程序集,它被複制到服務的輸出目錄,因爲它被引用。 ScheduleService是服務名稱。

如果我運行安裝程序,則服務已成功安裝。但是,由於裝配綁定錯誤而導致啓動失敗:

The service failed to start. System.IO.FileLoadException. The file or assembly "Connector, Version=1.0.0.0, Culture=neutral, PublickKeyToken=null" or a dependency could not be found. The located assembly's manifest definition does not match the assembly reference (HRESULT: 0x80131040). at ScheduleService.OnStart()

我想知道爲什麼可能會出現不匹配。所以我仔細看了一下這些文件。 WIX複製到安裝目錄的文件實際上與源文件不同。原始文件大小爲11,776字節,複製的文件大小爲12,800字節。如果我打開Visual Studio中的DLL文件,我得到不同的看法:

+ Original Connector.dll 
    + RT_MANIFEST 
    1 [neutral] 
    + Version 
    1 [neutral] 

+ Copied Connector.dll 
    + Version 
    1 [neutral] 

所以維克斯似乎已刪除清單。如果我用原來的覆蓋複製的DLL,我又能夠啓動服務。爲什麼WIX會這樣做?更重要的是,我該如何阻止WIX篡改文件以便啓動服務?

我已經清理了解決方案併發布了重建,導致了相同的情況。

+0

你確定你沒有建立到一個位置,然後從不同的位置抓取安裝程序的源文件? – BryanJ

回答

4

So WIX seems to have removed the manifest.

這很好的文學描述的設備,但是,當然,這不是發生了什麼。

我猜你的Scheduler項目有多個構建配置。而且,您正在查看一個構建,而WiX正在抓取另一個構建,這恰好缺少「本地」清單。

順便說一句,不要在同一個組件中使用多個File元素,除非它們是不可分割的(例如,在相同的.NET程序集中,這很少見)。請參閱Organizing Applications into Components

+0

該死的,我爲每個條目定義了相同的源文件。這就是爲什麼大會有不同的清單。 –