ClickOnce .net7 WPF 应用程序 - 为什么 ActivationUri 为空?

问题描述 投票:0回答:1

嘿,我正在尝试从另一个带参数的应用程序启动离线 .net7 clickonce wpf 应用程序。遵循其他几个线程和博客文章,我找到了以下解决方案。我们将启动器称为“App 1”,将启动的称为“App 2”。应用程序 2 在启动时使用以下代码:

try
{
    NameValueCollection nameValueTable = new();

    if (ApplicationDeployment.IsNetworkDeployed)
    {
        string? queryString = ApplicationDeployment.ActivationUri?.Query;
        if (ApplicationDeployment.ActivationUri == null)
        {
            MessageBox.Show("ActivationUri is null!");
            return null;
        }
        if (string.IsNullOrWhiteSpace(queryString))
        {
            MessageBox.Show("Query string empty!");
            return null;
        }

        nameValueTable = HttpUtility.ParseQueryString(queryString);
    }

    return (nameValueTable);
}
catch (Exception e)
{
    MessageBox.Show($"Error:{Environment.NewLine}{e.Message}");
    return null;
}

Aa 不幸的是,无论 App 2 是从快捷方式启动还是使用 Process.Start 启动,App 1 所做的事情都无关紧要,因为 ActivationUri 为 NULL。发布应用程序 2 时,设置:“允许将 URL 参数传递给应用程序”设置为 true。 知道为什么 ActivationUri 为空吗?

或者:您知道我传递/读取参数的方式与 ApplicationDeployment.ActivationUri.Query 不同吗?

相关文档:https://learn.microsoft.com/en-us/visualstudio/deployment/access-clickonce-deployment-properties-dotnet?view=vs-2022

编辑: 也许 App 1 所做的事情并不是那么无关紧要。我看到有些人声称,如果应用程序在本地启动,则不会设置 ActivationUri,但其他人说,如果在本地启动,此方法应该有效...即使设备当前没有,我也需要能够使启动参数起作用访问应用程序更新/安装的网络驱动器...这就是我启动应用程序的方式:

string shortcutPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.Programs)}\\Company\\{myAppName}.appref-ms";

var p = new Process();
p.StartInfo = new ProcessStartInfo(shortcutPath, "arg test")
{
    UseShellExecute = true,
};

编辑2:好吧,我的解决方案是多种解决方案的混合,事实证明我的实现无法离线工作。 这个博客解释了如何通过调用“AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData”来获取离线点击一次参数,但不幸的是“ActivationArguments”在AppDomain.CurrentDomain.SetupInformation中不存在...我在任何地方都找不到任何提及:/有什么想法吗?

编辑3:事实证明我没有正确测试我的应用程序 - 我从未传递过参数,但事实证明,解析任何参数都会在到达 OnStartup 之前使应用程序崩溃......即使在完全空的 wpf 项目。什么?!

wpf clickonce .net-7.0
1个回答
0
投票

这是一个棘手的问题。

微软说不要做我在这里所做的事情,但它正在发挥作用。我能够通过引用已安装的 .exe 来使参数正常工作。 (对我来说,它被隐藏在本地应用程序数据中)。然后我就可以使用

StartupEventArgs
中的参数了。

public partial class App1 : Application
{
    string app2Path = Environment.ExpandEnvironmentVariables(@"%localappdata%\Apps\2.0\EH2OVAR3.62J\53Y7M9Y1.QOB\app2..tion_0000000000000000_0001.0000_6a7609a423d3786f\App2.exe");
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var psi = new ProcessStartInfo(app2Path, "arg test");
        Process.Start(psi);
    }
}
public partial class App2 : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var msg = string.Join("\n", e.Args);
        MessageBox.Show(msg);
    }
}

来自微软的文档:https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.start?view=net-7.0

您可以通过将 fileName 参数设置为最初安装应用程序的位置(例如,Web 地址)来启动 ClickOnce 应用程序。不要通过指定硬盘驱动器上的安装位置来启动 ClickOnce 应用程序。

但是,像你一样,当我尝试时,我立即收到错误。

关于

ApplicationDeployment.ActivationUri.Query
,我认为这不适用于您的情况,因为您说这是一个离线应用程序。我认为这意味着您正在部署到本地并从那里安装。在这种情况下,我不确定是否不会有激活 uri,因为它看起来像是用于 Web 部署的 ClickOnce 应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.