gpt4 book ai didi

c# - 添加 WiX 自定义操作以将 MSI 日志文件复制到 LOCALAPPDATA 文件夹

转载 作者:行者123 更新时间:2023-11-30 22:07:53 25 4
gpt4 key购买 nike

我如何编写一个 WiX 自定义操作

  1. 总是在安装结束时调用,至少在出现安装错误时是这样
  2. 将当前 MSI 日志文件从其当前本地复制到用户的 APPDATA 文件夹

我有这个托管自定义操作代码。不确定如何在我的 Wix 脚本中编写它的调用。自定义操作是否应安排在 InstallFinalize 之后?可以调度OnExit="error"吗?

    [CustomAction]
public static void CopyLogFile(Session session)
{
const string company = "MyCompany";
const string product = "MyProduct";
try
{
session.Log("CustomAction.CopyLogFile entry");

var msiLogFilePath = session.CustomActionData["LOGFILEPATH"];
if (msiLogFilePath != null)
{
session.Log("CustomAction.CopyLogFile MSI log filename: {0}", msiLogFilePath);

var localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var destDirPath = Path.Combine(localAppDataPath, company, product);

var destDir = Directory.CreateDirectory(destDirPath);
session.Log("CustomAction.CopyLogFile Destination directory: {0}", destDir.FullName);

var destFilePath = Path.Combine(destDir.FullName, Path.GetFileName(msiLogFilePath));
File.Copy(msiLogFilePath, destFilePath, true);

session.Log("CustomAction.CopyLogFile Log file copied to: {0}", destFilePath);
}
else
{
session.Log("CustomAction.CopyLogFile File path not found");
}
}
catch (Exception exception)
{
session.Log("CustomAction.CopyLogFile exception {0}", exception);
}
finally
{
if (session != null)
{
session.Log("CustomAction.CopyLogFile exit");
session.Close();
}
}
}

最佳答案

是的,你可以安排在 InstallFinalize 之后(我也是,但如果不是完全删除包,我每次都复制它):

<InstallExecuteSequence>
<Custom Action="CopyLogfile" After="InstallFinalize">NOT (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE)</Custom>
</InstallExecuteSequence>

如果有的话,请记住也将它添加到 UI 序列中。我将它作为事件添加到 SetupCompleteSuccessSetupCompleteError 对话框中的 PushButton(也许你只需要将它添加到后者?)如下所示:

<Dialog Id="SetupCompleteSuccess" X="50" Y="50" Width="374" Height="266" Title="[ProductName]" NoMinimize="yes">
<Control Id="OK" Type="PushButton" X="230" Y="243" Width="66" Height="17" Text="&amp;Finish" TabSkip="no" Default="yes" Cancel="yes">
<Publish Event="EndDialog" Value="Exit">1</Publish>
<!-- ### Invoking copying the logfile if the Finish-button is pressed -->
<Publish Event="DoAction" Value="CopyLogfile">MsiLogFileLocation AND NOT (REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE)</Publish>
</Control>
<!-- ... rest of the dialog ... -->
</Dialog>

关于仅在出现错误时显示它:可能检查 ProductState-properrty?在网上搜索了这个但没有找到任何有用的东西。

编辑:也许只有在出现错误时才执行它的正确方法是使用仅在回滚期间执行它的自定义操作标志。在 WiX 中,它是 Execute="rollback" - CustomAction 标签的属性。

关于c# - 添加 WiX 自定义操作以将 MSI 日志文件复制到 LOCALAPPDATA 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22650003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com