首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WiX自定义操作从按钮开始

WiX自定义操作从按钮开始
EN

Stack Overflow用户
提问于 2015-10-29 00:02:20
回答 3查看 922关注 0票数 0

我有一个自定义操作来检查SQL连接。现在,它应该与控制按钮一起工作,但这不起作用。

自定义操作在没有按钮的情况下工作得很好:这里是wxs-File:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
代码语言:javascript
复制
<Property Id="SERVERNAME" Value="MSSQL2008R2" />
<Property Id="DATABASENAME" Value="MyDatabase" />
<Property Id="USERNAME" Value="admin" />
<Property Id="PASSWORD" Value="mypassword" />

<Binary Id="CA_SQLTestDLL" SourceFile="$(var.CA_SQLConnectionTest.TargetDir)CA_SQLConnectionTest.CA.dll" />
<CustomAction Id="SQL_Test"
              BinaryKey="CA_SQLTestDLL"
              DllEntry="ConnectionTest"
              Execute="deferred"
              Return="check" />
<SetProperty Id="SQL_Test" Value="SERVERNAME=[SERVERNAME];DATABASENAME=[DATABASENAME];USERNAME=[USERNAME];PASSWORD=[PASSWORD]" Sequence="execute" Before="SQL_Test" />

<InstallExecuteSequence>
  <Custom Action="SQL_Test" After="InstallInitialize" />
</InstallExecuteSequence>


<UI>
  <Dialog Id="SQLServerConnectionTestDlg" Width="370" Height="270" Title="SQL Server connection test">
    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
    <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
      <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
    </Control>
  </Dialog>
</UI>

下面是我的CustomAction类:

代码语言:javascript
复制
Imports System.Data
Imports System.Data.SqlClient
Public Class CustomActions
<CustomAction()> _
Public Shared Function ConnectionTest(ByVal session As Session) As ActionResult
session.Log("############## Begin CUSTOMACTION ##############")
Dim userName As String
Dim password As String
Dim serverName As String
Dim dataBase As String

serverName = session.CustomActionData("SERVERNAME")
dataBase = session.CustomActionData("DATABASENAME")
userName = session.CustomActionData("USERNAME")
password = session.CustomActionData("PASSWORD")

Dim SqlConn As New SqlConnection
Dim SqlConnStr As String = "Data Source=" + serverName + ";Database=" + dataBase + ";Persist Security Info=True;User ID=" + userName + ";Password=" + password

If SqlConn.State = ConnectionState.Closed Then
  SqlConn.ConnectionString = SqlConnStr
  Try
    SqlConn.Open()
  Catch ex As Exception
    Return ActionResult.Failure
  End Try
End If
session.Log("### SUCCESSFULL ###")
Return ActionResult.Success
  End Function

End Class

install.log:

代码语言:javascript
复制
Calling custom action CA_SQLConnectionTest!CA_SQLConnectionTest.CustomActions.ConnectionTest
############## Begin CUSTOMACTION ##############
### SUCCESSFULL ###

现在,我想用一个按钮启动自定义操作。所以我必须将Execute="deferred“改为Execute="immediate”,并添加一个按钮:

代码语言:javascript
复制
        <Control Id="TestConn" Type="PushButton" X="265" Y="205" Width="70" Height="18" Text="&amp;Test Connection">
      <Publish Event="DoAction" Value="SQL_Test">1</Publish>
      <Publish Property="ERRORMSG" Value="ConnectionTest">ACCEPTED = "1"</Publish>
      <Publish Event="SpawnDialog" Value="InvalidDBConnDlg">ACCEPTED = "0"</Publish>
    </Control>

      <Dialog Id="InvalidDBConnDlg" Width="260" Height="120" Title="MyTester">
    <Control Id="OK" Type="PushButton" X="102" Y="90" Width="56" Height="17" Default="yes" Cancel="yes" Text="OK">
      <Publish Event="EndDialog" Value="Exit" />
    </Control>
    <Control Id="Text" Type="Text" X="48" Y="22" Width="194" Height="60" Text="FAILED" />
    <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="WixUI_Ico_Info" />
  </Dialog>

现在,当我按下按钮时,安装程序会倾斜,并且在日志文件中出现致命错误:

代码语言:javascript
复制
Action 16:43:20: SQL_Test. 
Action start 16:43:20: SQL_Test.
MSI (c) (5C:5C) [16:43:20:236]: Invoking remote custom action. DLL: C:\Users\LOC~1.CRE\AppData\Local\Temp\MSIC08C.tmp, Entrypoint: ConnectionTest
Action ended 16:43:20: SQL_Test. Return value 3.
MSI (c) (5C:20) [16:43:20:404]: Note: 1: 2205 2:  3: Error 
MSI (c) (5C:20) [16:43:20:404]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 2896 
DEBUG: Error 2896:  Executing action SQL_Test failed.
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2896. The arguments are: SQL_Test, , 
Action ended 16:43:20: WelcomeDlg. Return value 3.
MSI (c) (5C:54) [16:43:20:405]: Doing action: FatalError
MSI (c) (5C:54) [16:43:20:405]: Note: 1: 2205 2:  3: ActionText 
Action 16:43:20: FatalError. 
Action start 16:43:20: FatalError.
Action 16:43:20: FatalError. Dialog created
Action ended 16:43:23: FatalError. Return value 2.
Action ended 16:43:23: INSTALL. Return value 3.
MSI (c) (5C:54) [16:43:23:488]: Destroying RemoteAPI object.
MSI (c) (5C:50) [16:43:23:488]: Custom Action Manager thread ending

Config useLegacyV2RuntimeActivationPolicy为"true“

我在Visual Studio 2013中使用WIX3.10

我不确定我做错了什么。但我认为这是InstallExecuteSequence的问题。

我希望有人能帮助我,谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-10-29 02:16:24

immediate是正确的做法,因为您不能在UI序列中有延迟的自定义操作(所以它不会像您怀疑的那样对执行序列有问题)。

除此之外,如果代码启动并失败,那么这是一个编码/环境问题。在此调试阶段,您应该在代码中放置消息框调用,检查是否具有这些值,当然,使用try/catch可以做更多的事情来消除任何异常!在您丢弃它并返回失败结果的同时,您正在询问错误可能是什么。

票数 0
EN

Stack Overflow用户

发布于 2015-10-29 15:01:18

谢谢,你说得对,这不是执行顺序的问题。

我已经缩小了问题的范围。当我不使用CustomActionData时,则执行自定义操作

代码语言:javascript
复制
userName = session.CustomActionData("USERNAME")
password = session.CustomActionData("PASSWORD")
...

为什么我不能不传递值?

更新:

该命令在此处不起作用:

代码语言:javascript
复制
session.CustomActionData("USERNAME")

使用以下命令可以很好地工作:

代码语言:javascript
复制
session("USERNAME")
票数 0
EN

Stack Overflow用户

发布于 2015-10-29 18:14:52

无法通过即时自定义操作访问CustomActionData。

但是您可以使用会话直接访问属性。

尝尝这个

代码语言:javascript
复制
  userName = session["USERNAME"];
  password = session["PASSWORD"];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33395924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档