2011-09-20 58 views
3

我正在開發自定義操作以將同一文件安裝到多個文件夾(在運行時確定)。WIX中的託管(C#)自定義操作不起作用(錯誤代碼1154)

自定義操作駐留在Wix C#自定義操作項目中。 它的代碼如下所示:

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult InstallToTrunks(Session session) 
    { 
     // some logic 
    } 
} 

相關維克斯標記看起來是這樣的:

<Binary Id='CustomActions' SourceFile='..\CustomActions\bin\$(var.Configuration)\CustomActions.dll' /> 
<CustomAction Id='InstallToTrunks' BinaryKey='CustomActions' DllEntry='InstallToTrunks' Execute='deferred' Return='check'/> 

<InstallExecuteSequence> 
    <Custom Action='InstallToTrunks' After='InstallInitialize'></Custom> 
</InstallExecuteSequence> 

然而,當我嘗試運行安裝程序,它失敗,並記錄說: CustomAction InstallToTrunks返回實際的錯誤代碼1154(注意,如果翻譯發生在沙箱內,這可能不是100%準確的)

任何幫助將是非常受歡迎的。 或者,如果您有關於如何實現我想要做的事情(將同一文件安裝到只能在retuntime中確定的多個文件夾中)的建議,則無需CustomActions,這也會有所幫助。

謝謝。

+0

沒有昂貴的行爲的一種方法是將文件添加爲功能。如果您需要將其安裝在3個不同的路徑中,請添加三個功能,每個功能都包含該文件。該功能應該使用屬性「ConfigurableDirectory」。也許這可以幫助你解決與costum行動的問題:[Similar problem](http:// stackoverflow。com/questions/3560370/custom-action-in-c-used-via-wix-fails-with-error-1154) – Skalli

回答

4

看起來您正在引用自定義操作程序集,而不是自定義操作DLL。這些自定義操作項目會生成一個名爲xxxx.CA.dll的非託管自定義操作DLL,其中包含自定義操作程序集及其依賴項的壓縮副本。

嘗試:

<Binary Id='CustomActions' SourceFile='..\CustomActions\bin\$(var.Configuration)\CustomActions.CA.dll' /> 
+0

工作!謝謝! – Svarog

3

WiX已通過CopyFile element支持該功能。

基本上,您爲每個要創建的副本創建一個CopyFile元素。然後,您可以將DestinationProperty屬性設置爲每個副本的自定義屬性。這些屬性可以在安裝過程中動態設置。

但是,如果你想使用自定義操作,有幾種解決方案:

定製。 NET DLL不受支持。如果您有.NET DLL,請將其轉換爲安裝程序類操作。

+0

但是,我永遠無法確定我需要多少CopyFiles,並且數量也可能發生變化。 – Svarog

+0

我更新了我的答案。 –

3

雖然你接受的答案,似乎你會去自定義操作方式,我想指出你注意的CopyFile方法是做這種的建議和支持的方式你在場景中描述的東西。如果您不確切知道要複製到的文件和位置的數量,則可以在安裝期間將臨時行添加到CopyFile表中以立即執行自定義操作。通過這種方式,您可以向Windows Installer提供關於要執行的操作的準確說明,並讓它執行其工作。

+0

謝謝,我認爲這就是我要在自定義操作中做的事情。 – Svarog