通过WiX使用的C#中的自定义操作失败,错误1154

时间:2010-08-24 19:38:09

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

我在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来调用工作自定义操作而不是非工作自定义操作,它可以作为epxected。

我还能看到什么才能让它发挥作用?

编辑:只是为了完成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" />

8 个答案:

答案 0 :(得分:46)

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

using Microsoft.Deployment.WindowsInstaller;
那你肯定是。请务必阅读以下内容,了解它们的工作原理:

Deployment Tools Foundation (DTF) Managed Custom Actions

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

基本上我觉得你将.NET程序集连接到安装程序而不是unmanged wrapper dll。阅读上面的文章,了解如何在Depends中查看它并了解期望的内容。 WiX | C#Custom Action项目应该输出Foo.dll和Foo.CA.dll。您希望在安装程序中使用更高版本。

对于将来登陆此页面的人(答案原本是海报),有一整套要检查的内容:

  1. 您是否在二进制表中引用了正确的DLL?
  2. 您是否引用了正确的导出函数名称?
  3. 你的班级是公开的吗?
  4. 您的方法是否使用了正确的签名?即它是:
  5. 使用正确的CustomAction属性标记
  6. 标记为公开?
  7. 标记为静态?
  8. 返回ActionResult?
  9. 以会议为论据?
  10. 确保使用WiX C#Custom Action Project类型以确保调用postbuild事件以创建本机DLL包装器。 (见#1)
  11. 其中任何一个都可能导致1154错误。这就是我写一篇关于这个主题的综合博客文章并在这个答案中与之相关的原因。完全理解托管代码如何呈现给非托管Windows Installer服务并了解如何使用Depends验证公共静态方法是否作为stdcall函数导出到WiX / DTF生成的.CA.dll中非常重要。 / p>

答案 1 :(得分:6)

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

public ActionResult MyMethod(Session session)

而不是:

public static ActionResult MyMethod(Session session)

更改方法后效果很好。

希望它有所帮助。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

<InstallExecuteSequence/>

希望获得更好的错误消息。我收到了不同的错误消息,具体取决于调用操作的方式。另外,尝试使用fuslogvw.exe。它也可能会给你一个非常好的错误信息。

答案 7 :(得分:0)

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

    }
}