我在 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 运行 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" />
最佳答案
听起来您正在使用 DTF。如果你看到:
using Microsoft.Deployment.WindowsInstaller;
那你肯定是。请务必阅读以下内容以了解其工作原理:
Deployment Tools Foundation (DTF) Managed Custom Actions
您还会在 WiX 下的开始菜单中找到 DTF 帮助 chm。
基本上,在我看来,您是在将 .NET 程序集连接到安装程序中,而不是未管理的包装器 dll。阅读上面的文章,了解如何在 Depends 中查看它并了解会发生什么。维克斯 | C# 自定义操作项目应输出 Foo.dll 和 Foo.CA.dll。您需要安装程序中的后者。
对于将来登陆此页面的人(答案最初是针对海报的),有一整套需要检查的事项:
- 您是否在二进制表中引用了正确的 DLL?
- 您是否引用了正确的导出函数名称?
- 你的类(class)是公开的吗?
- 您的方法使用的签名是否正确? IE。是吗:
- 标有正确的 CustomAction 属性
- 标记为公开?
- 标记为静态?
- 返回 ActionResult?
- 将 Session 作为参数?
- 确保您使用的是 WiX C# 自定义操作项目类型,以确保调用构建后事件来创建 native DLL 包装器。 (见#1)
其中任何一个都可能导致 1154 错误。这就是我写了一篇关于这个主题的综合博客文章并在这个答案中链接到它的原因。重要的是要充分了解托管代码如何呈现给非托管 Windows Installer 服务,并了解如何使用 Depends 验证公共(public)静态方法是否在 WiX/DTF 生成的结果 .CA.dll 中导出为 stdcall 函数。
关于c# - 通过 WiX 使用的 C# 中的自定义操作失败,出现错误 1154,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3560370/