'Application identity is not set' 与 ClickOnce

'Application identity is not set' with ClickOnce

我正在为这个问题摸不着头脑,并且花了很多时间研究它。我基于此问题查看的每个问题看起来都与调试有关(我也有调试问题)。然而,这不是背后的原因。

在我的应用程序中,我为用户提供了创建快捷方式的选项,以便应用程序在启动时自动 运行(我发现这比编辑注册表更容易)。

string copyPath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\";
using (StreamWriter writer = new StreamWriter(copyPath + "\" + "ZApp.url"))
{
    string app = System.Reflection.Assembly.GetExecutingAssembly().Location;
    writer.WriteLine("[InternetShortcut]");
    writer.WriteLine("URL=file:///" + app);
    writer.WriteLine("IconIndex=0");
    string icon = app.Replace('\', '/');
    writer.WriteLine("IconFile=" + icon);
    writer.Flush();
}

这段代码效果很好。但是,每当应用程序在后台检查更新时,它都会抛出 Application identity is not set 错误。

这是我用来检查更新的代码:

ApplicationDeployment deploy = ApplicationDeployment.CurrentDeployment; //<- Error thrown here
UpdateCheckInfo update = deploy.CheckForDetailedUpdate();

同样,如果我使用 ClickOnce 放置在我桌面上的图标启动应用程序,效果很好,但如果我使用我的代码在启动文件夹中创建的快捷方式图标,效果就不佳。我有办法以编程方式解决这个问题吗?

部署状态是错误的原因。 正如 rudolf_franek 所解释的那样,该应用程序未进行网络部署。在访问 CurrentDeployment 之前应用检查将使您的应用程序更安全:

if (ApplicationDeployment.IsNetworkDeployed)
{
    // accessing the CurrentDeployment won't throw an exception
    var deploy = ApplicationDeployment.CurrentDeployment;
}

但是要解决导致 ApplicationDeployment.IsNetworkDeployed 为假的问题,您应该看看这个 MSDN forum posttl;dr: 创建引用 *.exe 文件的快捷方式将使应用程序 运行 成为独立的。

解决方法:
您应该创建一个适当的快捷方式,在其中引用应用程序部署清单(a.k.a.*.application 文件)。 这应该可以解决问题。