问题描述
我有一个打包为 MSIX 应用程序的 WPF .NET Core 3.1 应用程序。该应用程序将一些资产从 S3 下载到 AppData 文件夹,并在某个时候启动另一个进程(另一个应用程序),其中一个参数是下载的资产之一(一个 Settings.xml 文件)的路径。
我面临两个问题:
-
应用有时将资产下载到“真实”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 次再次使用“真实”。我很确定没有任何代码更改可能导致这种情况。 -
我正在使用
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 桌面桥虚拟化了一些文件系统路径,但我希望它是可预测的。
问题
- 如何确保我下载的资产始终在同一路径上,无论是“真实”资产还是虚拟资产?
- 如何将第二个应用程序的参数设置为始终指向文件真正存在的位置(“真实”与虚拟化)?
解决方法
我还没有答案,但我需要您提供更多详细信息以进一步调查:
- 您确定在从 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 来编写您的应用程序数据。也许这行得通?
- 第二个应用程序是来自同一 MSIX 包的 EXE 还是来自机器的另一个单独的应用程序(使用自己的 MSI/MSIX 部署)? 我可能错了,但如果没记错的话,虚拟化的 AppData 文件夹只能在您的应用程序容器内访问,因此机器上的其他应用程序无法访问这些文件。
如果是这种情况,您可以尝试将数据保存在 CommonApplicationData 文件夹中,如果这不是用户特定的数据。
相关问题: