ClickOnce

时间:2015-06-24 11:32:30

标签: c# 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放置在桌面上的图标启动应用程序,它会很有效,但是如果我使用我的代码在启动文件夹中创建的快捷方式图标则不是很好。有没有办法让我以编程方式绕过这个?

1 个答案:

答案 0 :(得分:3)

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

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

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

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