2010-08-24 86 views
16

我在Visual Studio 2010中使用了WiX 3.5.1930,目标是.NET Framework 3.5。 (后来的每周版本的WiX似乎在他们的自定义动作模板方面已经非常糟糕,至少现在是这样。1930是最近的版本,似乎使可建立的C#CA带有工作参考。)通过WiX使用的C#中的自定义操作失败,错误1154

我有两个用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" /> 
+0

你是如何做这个自定义动作的?你在使用DTF吗? – 2010-08-24 23:53:02

+0

如果我使用部署工具基础(DTF - 为未来的搜索者拼写 - 我不知道它是什么,直到我刚刚查找它),我不知道我是。正如我所建议的,我正在使用自定义操作支持来让我参与到构建的操作中。我相信这是在下面使用DTF,但这并没有真正直接暴露出我所能说的最好的。 – 2010-08-25 11:49:37

回答

41

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

using Microsoft.Deployment.WindowsInstaller; 

那你肯定是。请务必阅读这一切是如何工作的下面:

Deployment Tools Foundation (DTF) Managed Custom Actions

而且你会发现在维克斯在开始菜单中DTF帮助CHM。

基本上,听起来对我来说,你是将.NET程序集连接到安装程序,而不是unmanged wrapper 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函数是非常重要的。

+4

好吧,这告诉我答案 - 当我将工作与非工作相比较时,我发现我使用.CA.DLL工作,而.DLL工作使用非工作工作。我改变了二进制标签,我很高兴去。 – 2010-08-25 14:44:17

+0

伟大的列表。我会补充一件让我失望一阵子的东西。确保自定义操作项目的类型为“C#自定义操作项目”(在Windows Installer XML项目类型下可见),而不是普通的“类库”。可能看起来很明显,但我错过了! – 2013-11-15 12:24:32

+0

同意。有一天,我刚刚做了一个屏幕分享会,与一位刚刚试图弄清楚的开发人员一起,这是他的问题。他创建了一个类库,并编写了代码,但是没有意识到他错过了将makebuf调用makefxca的目标引用。 – 2013-11-15 14:05:49

0

尝试把你的自定义操作呼叫

<InstallExecuteSequence/> 

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

+0

感谢您的回答。我在StackOverflow上看到关于WiX问题的一些其他帖子,并且昨天在那条路上走了。 (我应该在问题中这么说)。调用实际上已经在中,并且fuslogvw根本不显示任何绑定(我承认对此有点困惑)。 – 2010-08-25 13:48:05

+0

你是否引用了自定义操作中的任何其他dll?你的方法在做什么? – KnightsArmy 2010-08-25 13:53:39

+0

现在在破坏的一个中,为了排除故障,只有一个参考(Microsoft.Deployment.WindowsInstaller)在工作中,并且只有一个方法。我将编辑问题以显示代码。 – 2010-08-25 14:00:14

4

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

5

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

public ActionResult MyMethod(Session session) 

取而代之的是:

public static ActionResult MyMethod(Session session) 

改变它的工作就好了方法之后。

希望它可以帮助别人。

+0

谢谢我被这个难住! – 2011-05-23 15:36:00

+0

我很高兴你觉得它有用! – 2011-05-31 20:31:38

+0

这是我2010年答案中的#7。 :) – 2013-06-10 17:00:54

1

我想出了另一种非常简单(蠢)原因错误1154:拼写错误的CustomAction元素的DLL入口名称...

比较各种原因引起的其他人也发现,在我看来是错误1154手段在大多数情况下,“找不到DLL入口”。

+0

#2在我2010年的答案。 :) – 2013-06-10 17:01:59

1

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

+0

#5在我2010年的答案。 :) – 2013-06-10 17:01:38

0

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