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

我在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仅具有“返回成功”的自定义操作方法,因此validation它并不是很多,但它确实证实DLL没有损坏。

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

 using Microsoft.Deployment.WindowsInstaller; namespace Framework.Installer.Database { public class CustomActions { [CustomAction] public static ActionResult RunMigration(Session session) { return ActionResult.Success; } } } 

不是很多。 .wxs的相关部分如下:

      

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

 using Microsoft.Deployment.WindowsInstaller; 

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

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

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

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

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

  1. 您是否在二进制表中引用了正确的DLL?
  2. 您是否引用了正确的导出函数名称?
  3. 你的class级公开吗?
  4. 你的方法是否使用了正确的签名? 就是这样:
  5. 标有正确的CustomAction属性
  6. 标记为公开?
  7. 标记为静态?
  8. 返回ActionResult?
  9. 以会议为论据?
  10. 确保使用WiX C#Custom Action Project类型以确保调用postbuild事件以创建本机DLL包装器。 (见#1)

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

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

 public ActionResult MyMethod(Session session) 

而不是这个:

 public static ActionResult MyMethod(Session session) 

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

希望它可以帮到某人。

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

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

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

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

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

  

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

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