我为我的C#应用程序创建了一个带有WiX安装程序的安装程序。
我使用Class CustomAction来安装SQL数据库并设置文件夹的权限。
有我的班级:
public class CustomActions
{
[CustomAction]
public static ActionResult AllowAppData(Session session){...}
[CustomAction]
public static ActionResult Install_SetupDataBase(Session session){...}
}
product.wxs:
<Binary Id="CASetup.dll" SourceFile="$(var.SetupCustomAction.TargetDir)$(var.SetupCustomAction.TargetName).CA.dll" />
<CustomAction Id="CustomActionSetupAllow" BinaryKey="CASetup.dll" DllEntry="AllowAppData" Execute="immediate" />
<CustomAction Id="CustomActionSetupBase" BinaryKey="CASetup.dll" DllEntry="Install_SetupDataBase" Execute="immediate" />
<InstallExecuteSequence>
<Custom Action='CustomActionSetupAllow' After='InstallFinalize' />
<Custom Action='CustomActionSetupBase' After='InstallFinalize' />
</InstallExecuteSequence>
构建正常但是当安装执行时我收到消息:
我只试用CustomActionSetupAllow
并且它可以正常使用。但是CustomActionSetupBase
我收到了消息。
我怎么知道缺少什么DLL?我应该在哪里添加参考?
答案 0 :(得分:2)
错误&#34;无法运行&#34;并不意味着它失踪了。它位于MSI文件的二进制表中,并将流式传输到磁盘上运行。该错误意味着它不会加载和运行,或者正在崩溃。可能存在缺少依赖Dll的情况。
一个潜在的严重问题是您已将自定义操作(CA)标记为即时。这意味着它在安装任何东西之前运行,例如可能正在填充的空数据库,以及它可能需要的任何依赖Dll。除此之外,如果您使用直接CA创建SQL DB并且安装随后失败,那么您将拥有数据库但没有安装产品。它应该是一个延迟的自定义操作,理想情况下使用回滚CA来删除数据库,以便用户可以再次运行安装,如果这是一个问题,则不会再次填充相同的数据库。
您可能还想看其他方面。即时CA使用安装用户的凭证运行而不是提升,因此如果代码需要提升,则会失败。延迟CA将使用系统帐户升级,因此使用系统帐户访问SQL DB可能会出现问题。 CA中的代码需要非常防御,因为它与交互式测试的环境不同。出于这些原因,使用在应用程序首次运行时在真正的交互式环境中运行的启动程序来执行此操作通常会更好。