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

Mik*_*SFT 17 c# custom-action wix wix3.5 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)
Run Code Online (Sandbox Code Playgroud)

我已经比较了.csproj文件和.wixproj文件,并且我可以告诉它们差异是合适的(例如包含.cs文件的列表).我已经更改了非工作的.wxs来调用工作自定义操作而不是非工作自定义操作,它可以作为epxected.

我还能看到什么让这个工作?

编辑:只是要完成1154指的是一个无效的DLL - net helpmsg将它(英文)翻译为"运行此应用程序所需的库文件之一已损坏".

第二个编辑:跑peverify对DLL(抓住一个副本出\窗口\安装程序在安装程序正在运行),它说一切都在DLL罚款.DLL只有自定义操作方法,并且"返回成功",因此验证它并不是很多,但它确实证实DLL没有损坏.

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

using Microsoft.Deployment.WindowsInstaller;

namespace Framework.Installer.Database {
    public class CustomActions {

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

            return ActionResult.Success;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

不是很多..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" />
Run Code Online (Sandbox Code Playgroud)

Chr*_*ter 47

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

using Microsoft.Deployment.WindowsInstaller;
Run Code Online (Sandbox Code Playgroud)

那你肯定是.请务必阅读以下内容,了解它的工作原理:

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

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

基本上我觉得你将.NET程序集连接到安装程序而不是unmanged包装器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)

其中任何一个都可能导致1154错误.这就是我写一篇关于这个主题的综合博客文章并在这个答案中与之相关的原因.重要的是要完全理解托管代码如何呈现给非托管Windows Installer服务,以及如何使用Depends验证公共静态方法是否导出为WiX/DTF生成的.CA.dll中的stdcall函数.

  • 好吧,这告诉我答案 - 当我将工作与非工作进行比较时,我看到我使用的是.CA.DLL用于工作而.DLL用于非工作的.我更改了二进制标签,我很高兴. (4认同)
  • 很棒的清单。我会添加一件让我困惑了一段时间的事情。确保自定义操作项目的类型为“C# 自定义操作项目”(在 Windows Installer XML 项目类型下可见),而不是普通的“类库”。可能看起来很明显,但我错过了! (2认同)

小智 6

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


小智 6

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

public ActionResult MyMethod(Session session)
Run Code Online (Sandbox Code Playgroud)

而不是这个:

public static ActionResult MyMethod(Session session)
Run Code Online (Sandbox Code Playgroud)

改变方法后它工作得很好.

希望它可以帮助某人.

  • 这是我 2010 年的回答中的第 7 条。:) (2认同)