2016-11-04 95 views
0

我使用WiX安装程序为我的C#应用​​程序创建了一个安装程序。无法使用WiX安装程序进行设置

我使用类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> 

构建是好的,但是当安装完成我的消息:

enter image description here

我试过只有CustomActionSetupAllow它的作品fin即但与CustomActionSetupBase我收到了消息。

我怎么知道DLL丢失了?我应该在哪里添加参考?

回答

2

错误“无法运行”并不意味着它缺失。它位于MSI文件的二进制表格中,并将流式传输到磁盘上运行。该错误意味着它不会加载并运行,或者正在崩溃。有可能缺少依赖的Dll。

一个潜在的严重问题是您已将自定义操作(CA)标记为即时。这意味着它会在安装任何东西之前运行,例如可能会填充的空数据库以及它可能需要的任何依赖的Dll。除此之外,如果您使用直接CA创建SQL DB,并且安装随后失败,那么您将拥有一个数据库,但没有安装产品。它应该是延迟自定义操作,理想情况下使用回滚CA删除数据库,以便用户可以再次运行安装,并且不会再次填充相同的数据库,如果这是问题。

还有其他地方你可能想看看。即时CA与安装用户的凭证一起运行,因此如果代码需要提升,则会失败。延迟的CA将随系统帐户一起运行,因此使用系统帐户访问SQL DB可能会成为问题。 CA中的代码需要非常防御,因为它与交互式测试不一样。由于这些原因,最好是在应用程序第一次运行时使用在真正的交互式环境中运行的启动程序来执行此操作。

+0

我已将自定义操作标记为'After ='InstallFinalize''。这两个自定义操作都在同一个文件中。当我只调用'CustomActionSetupAllow'时它很好用,但只有'CustomActionSetupBase'有错误。我在第一行插入了一个断点,它不会中断。潜在缺少DLL是在安装项目还是在自定义操作项目中? –

+0

该死的我很愚蠢......我没有看到我在CustomActionSetupBase之前移除了标志'[CustomAction]'。我为这个错误浪费了很多时间。但很高兴知道,如果该标志不存在,则可能发生此错误。谢谢你的帮助 –

相关问题