WIX在自定义操作上设置会话属性并访问它

时间:2017-05-15 14:34:35

标签: c# .net wix

我有一个custum操作,我调用一个正在安装在程序文件文件夹中的DLL。在自定义操作中,我正在准备一个文本,该文本应该在安装结束时显示给正在安装我的程序的人员。 自定义Action的执行工作正常,即使在自定义操作中为会话分配值也可以无异常地完成

session["SEIA"] = "of the installation";
MessageBox.Show(session["SEIA"]);

消息框显示正确的文本。 现在在.wxs中完成以下操作:

<Property Id="SEIA" Value="test 1234"/>
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="this is the value at the end"/>
<CustomAction Id="custactionID" BinaryKey="cust_actions" DllEntry="custActionMeth" Execute="immediate" Return='check'/>
<CustomAction Id="CA_Set_WIXUI_EXITDIALOGOPTIONALTEXT" Property="WIXUI_EXITDIALOGOPTIONALTEXT" Value="this is the value at the end [SEIA]" Return='check'/>
<InstallExecuteSequence>
  <Custom Action="custactionID" After="InstallFinalize" />
  <Custom Action="CA_Set_WIXUI_EXITDIALOGOPTIONALTEXT" After="custactionID">NOT Installed</Custom>
</InstallExecuteSequence>

现在在安装结束时应该是一个可选文本:

  

这是安装结束时的值

但唯一显示的是:

  

这是最终测试1234的值

其他一些信息: 自定义操作=“custactionID”之后需要=“InstallFinalize”,因为我现在只能访问安装文件夹中的dll文件。 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

我找到了WIX行为的解决方案。 主要问题是传递给GUI的信息是在客户端部分中进行的。像将dll复制到目的地的东西是在服务器部分中进行的。因此,两部分之间的沟通是不可能的。那么我怎样才能访问客户端部分中的dll。让我的东西完成是个问题。这很简单。我将所有的dll提取到一个临时文件夹,

 string tempFold = @"C:\Windows\Temp\Extract";
        deleteDissTemp();
        Directory.CreateDirectory(tempFold);
        string parameters = string.Empty;
        parameters = string.Format(@"/a {0} /qn TARGETDIR=""{1}"" REINSTALLMODE=a", Path.Combine(path2Source, "DiSetup.msi"),
            tempFold);
        Process process = Process.Start("msiexec", parameters);
        process.WaitForExit();

然后我接受所需的dll(通过执行dll),获取gui的信息并将其存储在会话中。 从使用中的msi包中提取dll没有任何问题。然后我启动服务器部分,将我的dll复制到定义的位置,最后我删除temp文件夹中的teh文件夹。删除临时文件夹的原因是执行的dll仍在使用中且无法被删除。(无法弄清楚appdomain如何工作:-()。无论如何,谢谢!