如何用ClickOnce提供更新说明?

时间:2013-06-27 12:24:26

标签: c# clickonce updates

我们有一个应用程序,我编写了很多年,现在我通过ClickOnce推送了更新。该应用程序位于我们的主文件服务器上。但是每当我推出更新时,我都会被问到我改变了什么!有没有办法用ClickOnce提供个性化的更新说明,这将是用户友好的?例如,当用户启动他们的应用程序时,ClickOnce会询问“新版本是否可用。您要更新吗?”,在下面我可以描述我已更新的内容?或者ClickOnce是不可能的?

4 个答案:

答案 0 :(得分:10)

我是这样做的。我在我的启动代码中以发布模式调用此方法:

using System.Deployment.Application;
...

private void DisplayChangeLog()
{
    if (!ApplicationDeployment.IsNetworkDeployed)
        return;

    if (!ApplicationDeployment.CurrentDeployment.IsFirstRun)
        return;

    ThreadPool.QueueUserWorkItem(state =>
        Execute.OnUIThread(() => <Pop up window with latest changes> ));
}

我知道这不是正好你想要的东西,因为它显示用户第一次运行应用程序,但 后他们已经安装了更新。在我们的环境中,用户无论是否更新都无法选择,因此没有什么区别。

答案 1 :(得分:6)

无法将ClickOnce作为标准配置。如果要向用户显示有关更改的消息,则需要自己实现。一种方法是禁用自动更新,然后check for updates programatically。然后,您可以使用该版本从XML文件或类似文件中获取更改,并将其显示给用户。

或者,您可以只提供HTML格式的changelog或其他可能更简单的内容。

例如,请参阅Stack Overflow问题 Looking for recomendation to show release notes in ClickOnce applications

无论哪种方式,通常如果有更新,为什么用户不想要它?

答案 2 :(得分:2)

我最近花了相当多的时间研究和编程操作在ClickOnce应用程序发布过程中产生的清单文件,我还没有看到一种方法来添加像你这样的自由格式描述想要,并且肯定没有办法通过Visual Studio提供的向导或UI来实现它。

(警告:我明天会在工作中仔细检查这一点,以确保完全没有办法 - 但你应该假设没有。)

答案 3 :(得分:1)

只要您让ClickOnce自动检查更新,就无法更改ClickOnce的更新对话框。

要实现此目的,您必须使用@[User::FileType] == "Txt" 提供的方法在应用程序中以编程方式处理更新。这允许您定义自己的更新对话框。有关官方的HowTo,请参阅here。核心原则如下:

Sub leirasok_kozetkodokhoz_D_oszlop()

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False

Dim i As Long
For i = 1 To 46543

DoEvents

Dim Azonosito As Long
Dim lastRow As Long
Dim Reteg As Long
Dim Mintaszam As Long
'Dim B As Long
Dim D As Long
'Dim F As Long
Dim Reteg_leiras As String

Sheets("MINTA").Activate
'B = Range("B1").Offset(i, 0)
D = Range("D1").Offset(i, 0)
'F = Range("F1").Offset(i, 0)
If D > 0 And IsEmpty(Range("D1").Offset(i, 1)) Then
    Azonosito = Range("U1").Offset(i, 0)
    Reteg = Range("Y1").Offset(i, 0)
    Mintaszam = Range("X1").Offset(i, 0)
    Sheets("egyesitett").Activate
    With Sheets("egyesitett").ListObjects("_1").Range
        .AutoFilter Field:=23, Criteria1:=Azonosito
        .AutoFilter Field:=25, Criteria1:=Reteg
        lastRow = .SpecialCells(xlCellTypeVisible).Rows.Count - 1
    End With
    If lastRow > 0 Then
           Dim tbl As ListObject
           Dim rngTable As Range
           Dim rngArea As Range
           Dim rngRow As Range

           Set tbl = ActiveSheet.ListObjects("_1")
           Set rngTable = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible)

           For Each rngArea In rngTable.Areas

                 For Each rngRow In rngArea.Rows
                    'something is wrong here... 
                    If Mintaszam >= rngRow.Cells(26) And Mintaszam <= rngRow.Cells(27) Then
                    Reteg_leiras = rngRow.Cells(35)
                    Sheets("MINTA").Activate
                    Range("D1").Offset(i, 1) = Reteg_leiras
                    End If
                 Next
           Next
    End If
End If

Next i

Application.Calculation = xlCalculationAuto
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

但是,在调用ApplicationDeployment.CurrentDeployment时,在那里描述的方法中存在一个错误,并且您在ClickOnce部署中有文件关联。有关详细信息,请参阅forumbug report。 (我不知道这个bug是否已经修复。)

作为解决方法,您可以用以下代码替换ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; info = ad.CheckForDetailedUpdate(); if (info.UpdateAvailable) { // insert your update dialog here ad.Update(); }

ad.Update()