我们有一个应用程序,我编写了很多年,现在我通过ClickOnce推送了更新。该应用程序位于我们的主文件服务器上。但是每当我推出更新时,我都会被问到我改变了什么!有没有办法用ClickOnce提供个性化的更新说明,这将是用户友好的?例如,当用户启动他们的应用程序时,ClickOnce会询问“新版本是否可用。您要更新吗?”,在下面我可以描述我已更新的内容?或者ClickOnce是不可能的?
答案 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部署中有文件关联。有关详细信息,请参阅forum和bug report。 (我不知道这个bug是否已经修复。)
作为解决方法,您可以用以下代码替换ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
info = ad.CheckForDetailedUpdate();
if (info.UpdateAvailable)
{
// insert your update dialog here
ad.Update();
}
:
ad.Update()