我有一个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文件。 在此先感谢您的帮助。
答案 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如何工作:-()。无论如何,谢谢!