WIX中的托管(C#)自定义操作不起作用(错误代码1154)

时间:2011-09-20 12:03:46

标签: c# wix windows-installer custom-action

我正在开发一个自定义操作,将同一个文件安装到多个文件夹中(在运行时确定)。

自定义操作位于Wix C#Custom Action Project中。 它的代码如下:

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

相关的WIX标记如下所示:

    <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%准确)

非常欢迎任何帮助。 或者,如果你有一个关于如何实现我想要做的事情的建议(在没有CustomActions的情况下将相同的文件安装到只能在retuntime确定的多个文件夹中),这也会有所帮助。

感谢。

3 个答案:

答案 0 :(得分:4)

看起来您正在引用自定义操作程序集,而不是自定义操作DLL。这些自定义操作项目生成一个名为xxxx.CA.dll的非托管自定义操作DLL,其中包含自定义操作程序集及其依赖项的压缩副本。

尝试:

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

答案 1 :(得分:3)

WiX已通过CopyFile element支持此功能。

基本上,您为要制作的每个副本创建一个CopyFile元素。然后,您可以将 DestinationProperty 属性设置为每个副本的自定义属性。可以在安装期间动态设置这些属性。

但是,如果您想使用自定义操作,则有以下几种解决方案:

不支持自定义.NET DLL。如果您有.NET DLL,请将其转换为安装程序类操作。

答案 2 :(得分:3)

虽然您接受了答案并且似乎您将采用自定义操作方式,但我会注意到CopyFile方法是您在场景中执行此类操作的推荐和支持方式。如果您不确切知道要复制到的文件和位置的数量,则可以在安装期间立即将自定义操作中的临时行添加到CopyFile表中。通过这种方式,您可以为Windows Installer提供有关操作的确切说明,并让它完成其工作。