【问题标题】:Custom Action in C# used via WiX fails with error 1154通过 WiX 使用的 C# 中的自定义操作失败并出现错误 1154
【发布时间】:2010-08-24 19:38:08
【问题描述】:

我在 Visual Studio 2010 中使用 WiX 3.5.1930,目标是 .NET Framework 3.5。 (就其自定义操作模板而言,后来每周构建的 WiX 似乎非常糟糕,至少目前如此。1930 是最近的构建,它似乎使可构建的 C# CA 具有工作参考。)

我有两个用 C# 编写的自定义操作程序集。其中一个工作正常。另一个失败并出现以下错误:

CustomActionnNameHere returned actual error code 1154 (note this may not be 100% accurate if translation happened inside sandbox)

我已经比较了 .csproj 文件和 .wixproj 文件,并且尽我所能判断差异是否合适(例如,包含的 .cs 文件列表)。我已将非工作 .wxs 更改为调用工作自定义操作而不是非工作自定义操作,它的工作原理与预期一样。

我还可以看看什么来让它工作?

编辑:完整地说,1154 指的是无效的 DLL - net helpmsg 将其(英文)翻译为“运行此应用程序所需的库文件之一已损坏。”

第二次编辑:对 dll 运行 peverify(在安装程序运行时从 \windows\installer 中获取了一个副本),它说 dll 中的一切都很好。 DLL 仅具有“返回成功”的自定义操作方法,因此没有太多需要验证的内容,但它确实确认 DLL 没有损坏。

第三次编辑:损坏的自定义操作中的代码如下:

using Microsoft.Deployment.WindowsInstaller;

namespace Framework.Installer.Database {
    public class CustomActions {

        [CustomAction]
        public static ActionResult RunMigration(Session session) {

            return ActionResult.Success;
        }

    }
}

没什么大不了的。 .wxs的相关部分如下:

<InstallExecuteSequence>
  <Custom Action="DotNetMigratorCustomActionPreviousUp" After="SetMigrationPropertiesPreviousUp"><![CDATA[(&Database = 3)]]></Custom>
</InstallExecuteSequence>

<Binary Id="DotNetMigratorCustomActionDll"
        SourceFile="$(var.Framework.Installer.Database.CustomActions.TargetDir)\SoftwareAnswers.Framework.Installer.Database.CustomActions.dll" />

<CustomAction Id="DotNetMigratorCustomActionPreviousUp"
              Return="check"
              BinaryKey="DotNetMigratorCustomActionDll"
              DllEntry="RunMigration"
              Execute="deferred" />

【问题讨论】:

  • 您是如何进行此自定义操作的?你在使用 DTF 吗?
  • 如果我使用的是部署工具基金会(DTF - 为未来的搜索者明确说明 - 在我查找之前我不知道它是什么)我不知道我是。正如我建议的那样,我正在使用自定义操作支持来让我参与构建的操作。我相信这是在下面使用 DTF,但据我所知,这并没有真正直接暴露出来。

标签: c# wix wix3.5 custom-action votive


【解决方案1】:

听起来您正在使用 DTF。如果你看到:

using Microsoft.Deployment.WindowsInstaller;

那你肯定是。请务必阅读以下内容以了解其工作原理:

Deployment Tools Foundation (DTF) Managed Custom Actions

您还可以在 WiX 下的开始菜单中找到 DTF 帮助 chm。

基本上,在我看来,您正在将 .NET 程序集连接到安装程序中,而不是未管理的包装器 dll。阅读上面的文章,了解如何在 Depends 中查看它并了解会发生什么。维克斯 | C# 自定义操作项目应输出 Foo.dll 和 Foo.CA.dll。您希望在安装程序中使用后者。

对于将来登陆此页面的人(答案最初是给海报的),有一个完整的清单要检查:

  1. 您是否在二进制表中引用了正确的 DLL?
  2. 您是否引用了正确的导出函数名称?
  3. 你的课程是公开的吗?
  4. 您的方法是否使用了正确的签名? IE。是吗:
  5. 标有正确的 CustomAction 属性
  6. 标记为公开?
  7. 标记为静态?
  8. 返回 ActionResult?
  9. 将会话作为参数?
  10. 确保您使用的是 WiX C# 自定义操作项目类型,以确保调用 postbuild 事件来创建本机 DLL 包装器。 (见 #1)

其中任何一种都可能导致 1154 错误。这就是我写一篇关于这个主题的综合博客文章并在这个答案中链接到它的原因。重要的是要充分了解托管代码如何呈现给非托管 Windows Installer 服务,并了解如何使用 Depends 来验证公共静态方法是否作为标准调用函数导出到 WiX/DTF 生成的结果 .CA.dll 中。

【讨论】:

  • 好的,这告诉了我答案——当我将工作与非工作进行比较时,我发现我使用 .CA.DLL 来表示工作,而 .DLL 用于非工作。我更改了 Binary 标签,一切顺利。
  • 很棒的清单。我会添加一件让我困惑了一段时间的事情。确保自定义操作项目的类型为“C# 自定义操作项目”(在 Windows Installer XML 项目类型下可见),而不是普通的“类库”。可能看起来很明显,但我错过了!
  • 同意。前几天我刚和一个开发人员进行了一次屏幕共享会话,他只是想弄清楚这件事,这就是他的问题。他创建了一个类库并编写了代码,但没有意识到他错过了将 postbuild 调用引入到 makefxca 的目标引用。
  • 过去曾投过赞成票,但又回到了这个名单。我希望有办法重新投票。
  • @ShinT 很高兴为您提供帮助。 Stack Overflow 是我们对曾经知道但忘记学习新事物的东西的冥想。
【解决方案2】:

如果您在 Visual Studio (Votive) 中创建自定义操作,请确保您创建的是 Wix Custon Action 项目而不是类库,否则您必须使用 MakeSfxCA 工具来打包您的自定义操作。

【讨论】:

    【解决方案3】:

    我刚刚发现了同样的问题(使用正确的 .CA.dll 文件),就我而言,这是因为我没有使用静态方法。我有这个:

    public ActionResult MyMethod(Session session)
    

    而不是这个:

    public static ActionResult MyMethod(Session session)
    

    更改方法后效果很好。

    希望它对某人有所帮助。

    【讨论】:

    • 谢谢我被这个难住了!
    • 很高兴你发现它有用!
    • 那是我 2010 年回答中的第 7 位。 :)
    【解决方案4】:

    我发现错误 1154 的另一个非常简单(且愚蠢)的原因:在 CustomAction 元素中拼错了 DLL 条目名称...

    比较其他人发现的各种原因,在我看来,错误 1154 在大多数情况下意味着“找不到 DLL 条目”。

    【讨论】:

      【解决方案5】:

      我看到此错误的另一个原因是我忘记将 [CustomAction] 属性添加到我的 c# 函数的名称中。

      【讨论】:

        【解决方案6】:

        我的回答与这个问题没有直接关系。但就我而言,我陷入了相同的错误代码 1154,因为我在同一个类中又创建了一个函数,但没有将该函数标记为 [CustomAction]

        我的代码看起来像

        namespace VerifyUserInfo {
            public class CustomActions {
        
                [CustomAction]
                public static ActionResult TryToLogin(Session session) {
        
                    return ActionResult.Success;
                }
        
                public static ActionResult RegisterDevice(Session session) {
        
                    return ActionResult.Success;
                }
        
            }
        }
        

        但后来我修复了在新功能上方添加的[CustomAction] 并解决了问题

        namespace VerifyUserInfo {
            public class CustomActions {
        
                [CustomAction]
                public static ActionResult TryToLogin(Session session) {
        
                    return ActionResult.Success;
                }
        
                [CustomAction]
                public static ActionResult RegisterDevice(Session session) {
        
                    return ActionResult.Success;
                }
        
            }
        }
        

        【讨论】:

          【解决方案7】:

          在我的例子中,它是函数名的长度。它是 27 个字符,我们得到了错误。 我们将函数名称更改为 24 个字符,并且成功了。

          【讨论】:

          • 我认为这是在更高版本的 wix 中修复的。我正在使用 wix 3.11 调用 36 字符的方法名称。
          【解决方案8】:

          尝试将您的自定义操作调用放入

          <InstallExecuteSequence/>
          

          希望得到更好的错误信息。根据调用操作的方式,我收到了不同的错误消息。另外,尝试使用 fuslogvw.exe。它也可能会给你一个很好的错误信息。

          【讨论】:

          • 感谢您的回答。我在 StackOverflow 上看到了其他一些关于 WiX 问题的帖子,并在昨天走上了这条路。 (我应该在问题中这么说。)调用实际上已经在 中,并且 fuslogvw 根本没有显示任何绑定(我承认有点困惑)。
          • 您是否在损坏的自定义操作中引用了任何其他 dll?你的方法是做什么的?
          • 目前在损坏的那个中,为了排除故障,只有一个参考(Microsoft.Deployment.WindowsInstaller)在工作中,并且只有一种方法。我将编辑问题以显示代码。
          猜你喜欢
          • 2011-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多