2011-09-20 69 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