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

问题描述 投票:17回答:8

我正在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运行修补程序(在安装程序运行时从\ 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" />
c# wix wix3.5 custom-action votive
8个回答
47
投票

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

using Microsoft.Deployment.WindowsInstaller;

那么你当然是。请务必阅读以下内容,了解其全部工作原理:

Deployment Tools Foundation (DTF) Managed Custom Actions

此外,您还将在WiX的开始菜单中找到DTF帮助chm。

基本上,在我看来,您是将.NET程序集连接到安装程序中,而不是将未包装的dll包装到安装程序中。阅读上面的文章,以概述如何在Depends中查看它以及知道会发生什么。 WiX | 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中的stdcall函数。] >


6
投票

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


6
投票

我刚刚发现了相同的问题(使用正确的.CA.dll文件


4
投票

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


2
投票

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


1
投票

就我而言,这是函数名称的长度。它是27个字符,我们得到了错误。我们将函数名称更改为24个字符,并且可以使用。


0
投票

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


0
投票

我的答案与这个问题没有直接关系,所以请不要投票,但就我而言,我陷入了相同的错误代码1154,因为我在同一类中创建了另一个函数,但未将该函数标记为[CustomAction]

© www.soinside.com 2019 - 2024. All rights reserved.