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)
那你肯定是.请务必阅读以下内容,了解它的工作原理:
您还可以在WiX下的开始菜单中找到DTF帮助chm.
基本上我觉得你将.NET程序集连接到安装程序而不是unmanged包装器dll.阅读上面的文章,了解如何在Depends中查看它并了解预期结果.WiX | C#Custom Action项目应该输出Foo.dll和Foo.CA.dll.您希望安装程序中的更高版本.
对于将来登陆此页面的人(答案原本是海报),有一整套要检查的内容:
其中任何一个都可能导致1154错误.这就是我写一篇关于这个主题的综合博客文章并在这个答案中与之相关的原因.重要的是要完全理解托管代码如何呈现给非托管Windows Installer服务,以及如何使用Depends验证公共静态方法是否导出为WiX/DTF生成的.CA.dll中的stdcall函数.
小智 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)
改变方法后它工作得很好.
希望它可以帮助某人.
| 归档时间: |
|
| 查看次数: |
13342 次 |
| 最近记录: |