打包的 WPF 应用程序在用作新进程的参数时返回错误的 AppData 路径

如何解决打包的 WPF 应用程序在用作新进程的参数时返回错误的 AppData 路径

我有一个打包为 MSIX 应用程序的 WPF .NET Core 3.1 应用程序。该应用程序将一些资产从 S3 下载到 AppData 文件夹,并在某个时候启动另一个进程(另一个应用程序),其中一个参数是下载的资产之一(一个 Settings.xml 文件)的路径。

我面临两个问题:

  1. 应用有时将资产下载到“真实”AppData 路径 (C:\Users\my_user\AppData\Local\some_created_folder),有时下载到虚拟化路径 (C:\Users\my_user\AppData\Local\Packages\package_id\LocalCache\Local\some_created_folder)。我最近才在 3 个不同版本(3 个连续版本)中注意到后者:第 1 次使用“真实”,第 2 次使用虚拟化,第 3 次再次使用“真实”。我很确定没有任何代码更改可能导致这种情况。

  2. 我正在使用 Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 编写下载路径。当资产被下载到虚拟化路径时,第二个应用程序没有正确启动,因为在启动过程时设置为参数的设置文件路径指向“真实”路径(总是!)。不会抛出任何异常或错误

var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var settingsFilePath = Path.Combine(appData,"Settings","Settings.xml");

...

var settingsFile = new FileInfo(settingsFilePath);
if (settingsFile.Exists)
{
    var arguments = $"-l \"{settingsFile.FullName}\"";
    var fileInfo = new FileInfo(_options.ExePath);
    var process = new Process
    {
        StartInfo = new processstartinfo
        {
             FileName = fileInfo.FullName,WorkingDirectory = fileInfo.DirectoryName ?? string.Empty,Arguments = arguments
        }
    };

    if (process.Start())
    {
        process.WaitForInputIdle();
    }

     _logger.LogDebug("Started {name} {arguments}",fileInfo.FullName,arguments);
}
else
{
     throw new FileNotFoundException($"Settings file not found at path '{settingsFile.FullName}'!",Path.GetFileName(settingsFile.Name));
}

我阅读了 this,但我不明白为什么该应用的行为如此不可预测。或者我错过了什么?包清单文件具有 EntryPoint="Windows.FullTrustApplication"。我也知道 UWP 桌面桥虚拟化了一些文件系统路径,但我希望它是可预测的。

问题

  1. 如何确保我下载的资产始终在同一路径上,无论是“真实”资产还是虚拟资产?
  2. 如何将第二个应用程序的参数设置为始终指向文件真正存在的位置(“真实”与虚拟化)?

enter image description here

解决方法

我还没有答案,但我需要您提供更多详细信息以进一步调查:

  1. 您确定在从 VS 调试应用程序时,“真实”appdata 文件夹下的文件不是您意外创建的吗?

据我所知,打包的应用程序在打开该位置已存在的文件夹或文件时,会使用普通的、真实的 AppData 资源和路径。如果 Appdata 文件夹/文件是从头开始创建的,则应使用虚拟化位置。

当从 MSI 迁移到 MSIX 时,此行为很有用,直到用户选择卸载 MSI 版本,MSI 和 MSIX 变体可以并行使用,两者都可以访问相同的 AppData 文件。

再说一次,如果这不是您的应用程序的第一个版本,并且您之前已将其作为 MSI 部署给您的用户,则从内部运行时,您将无法确定正在使用哪个 AppData 文件夹容器。

C:\Users\my_user\AppData\Local\some_created_folder

但是,在对此进行研究时,我发现您也可以使用 Windows.Storage.ApplicationData.Current.LocalFolder.Path 来编写您的应用程序数据。也许这行得通?

  1. 第二个应用程序是来自同一 MSIX 包的 EXE 还是来自机器的另一个单独的应用程序(使用自己的 MSI/MSIX 部署)? 我可能错了,但如果没记错的话,虚拟化的 AppData 文件夹只能在您的应用程序容器内访问,因此机器上的其他应用程序无法访问这些文件。

如果是这种情况,您可以尝试将数据保存在 CommonApplicationData 文件夹中,如果这不是用户特定的数据。

相关问题:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?