20

我在 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" />
4

8 回答 8

54

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

using Microsoft.Deployment.WindowsInstaller;

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

部署工具基础 (DTF) 托管的自定义操作

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

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

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

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

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

于 2010-08-25T14:21:28.560 回答
6

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

于 2010-09-30T18:25:21.703 回答
6

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

public ActionResult MyMethod(Session session)

而不是这个:

public static ActionResult MyMethod(Session session)

改变方法后,它工作得很好。

希望它可以帮助某人。

于 2011-04-09T23:35:39.360 回答
4

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

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

于 2012-01-31T12:21:09.823 回答
2

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

于 2013-01-25T20:42:29.657 回答
1

在我的情况下,它是函数名长度。它是 27 个字符,我们得到了错误。我们将函数名称更改为 24 个字符,并且它起作用了。

于 2013-10-02T19:05:38.473 回答
1

我的回答与这个问题没有直接关系。但就我而言,我陷入了相同的错误代码 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;
        }

    }
}
于 2019-11-13T07:04:00.803 回答
0

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

<InstallExecuteSequence/>

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

于 2010-08-25T13:24:59.107 回答