2008-10-13 10 views

Trả lời

18

ClickOnce sẽ sử dụng bất kỳ phiên bản nào bạn gửi cho họ. Nếu bạn gửi cho họ một phiên bản cũ, họ sẽ quay trở lại phiên bản cũ đó.

Quay lại vào tháng Năm bạn thân của tôi David đã viết một bài viết về cách thực hiện điều này trên cơ sở mỗi người dùng. Chúng tôi theo nghĩa đen có thể có mọi người dùng trên một phiên bản khác. Ứng dụng này thậm chí còn nói cho cơ sở dữ liệu biết phiên bản nào người dùng muốn, vì vậy họ có thể về lý thuyết thay đổi phiên bản của họ và sau đó chỉ cần khởi động lại ứng dụng.

Fine Grained Versioning with ClickOnce

+0

Chúc mừng, Điều đó trông giống như một cách tiếp cận tốt đẹp! –

6

Bạn có thể vào ứng dụng Thêm/Xóa và chọn ứng dụng của bạn và chọn cài đặt cuối cùng thay thế.

+0

Cảm ơn Mate, tôi sẽ cố gắng mà ra vào buổi sáng! –

+0

phương pháp rất đơn giản để quay lại một phiên bản. Cảm ơn Patrick. – TWood

1

Nếu bạn nhìn vào vị trí triển khai của mình, bạn sẽ thấy mọi phiên bản trước đó, trong một thư mục riêng biệt với số phiên bản được nối, cũng như tệp kê khai triển khai, cùng với số phiên bản được nối thêm.

Bạn có thể đổi tên bất kỳ một trong số chúng thành triển khai hiện tại và lần tiếp theo bạn cập nhật ứng dụng đó, ứng dụng sẽ kéo vào phiên bản bạn đã quay lại.

+1

có hoạt động không? - nó sẽ rất hữu ích –

+0

Tôi không biết điều đó có hiệu quả hay không. Tệp kê khai triển khai có đường dẫn đến tệp kê khai ứng dụng, nhưng tệp kê khai ứng dụng tôi tin cũng có phiên bản trong đó. Bạn cũng không thể chỉ cập nhật nó mà không cần từ chức. –

2

Bạn có thể sử dụng MAGEUI để rollback đến một phiên bản manifest trước trên máy chủ. Check this out.

+0

Bạn có thể cung cấp (a) phiên bản hiện được cài đặt chưa bao giờ có phiên bản yêu cầu tối thiểu được đặt trong tệp kê khai và (b) khả năng không thể đọc cài đặt ứng dụng của phiên bản trước đó. Xem nhận xét của tôi về câu trả lời này http://stackoverflow.com/a/273719/607117 để biết thêm thông tin về điểm cuối cùng đó. –

76

Bạn có thể hoàn nguyên về phiên bản cũ hơn ở phía máy chủ bằng cách thay đổi tệp kê khai máy chủ. Khi máy khách khởi động lại ứng dụng, nó sẽ thấy rằng nó có một phiên bản khác với phiên bản mà máy chủ nói là phiên bản 'hiện tại' và nó sẽ tải xuống phiên bản mới. Tệp kê khai máy chủ này thường luôn trỏ đến phiên bản mới nhất, nhưng nó không phải.

Dưới đây là cách thay đổi (Tôi đã xuất bản bằng Visual Studio 2008. Các phiên bản khác có thể có cấu trúc thư mục xuất bản khác).

Trong cùng thư mục với publication.htm là tài liệu XML được gọi là [appName].application. Đây là tệp kê khai phía máy chủ mà ứng dụng khách sử dụng để so sánh phiên bản hiện tại của nó với. Có trong tài liệu này bao gồm phiên bản 'hiện tại' mà máy khách nên chạy cũng như vị trí trên máy chủ mà các tệp triển khai có thể được tìm thấy.

Trong cùng một vị trí như publish.htm cũng là một thư mục có tên là 'Tệp ứng dụng'. Thư mục này chứa các thư mục con cho mỗi lần xuất bản trước đó. Trong mỗi thư mục con này là một tài liệu XML khác có cùng tên mà tôi đã đề cập ở trên được gọi là [appName].application. Sao chép tệp này (từ bất kỳ thư mục nào chứa phiên bản bạn muốn hoàn nguyên về) và dán nó vào cùng thư mục với tên publish.htm (một vài cấp). Khi ứng dụng khách khởi động lại, nó sẽ xuất hiện giống như một phiên bản mới có sẵn, tải xuống và chạy nó. Ứng dụng khách hiện sẽ chạy phiên bản trước.

+0

Cảm ơn Jason, tôi đã kết thúc bằng cách sử dụng như vậy và cách tiếp cận :) –

+2

Ngoài ra, bạn có thể thao tác tệp publish.htm để phản ánh số phiên bản tương ứng (bên trong khối AppInfo) – jan

+0

Câu trả lời hay. Cảm ơn. –

0

Tôi chỉ phải thực hiện một trong những điều này trên máy chủ sản xuất trực tiếp của mình và thật tuyệt khi có tất cả các ghi chú này. Giải pháp của tôi hơi khác một chút và tôi cũng muốn thêm giải pháp này làm bản sửa lỗi. Trước khi triển khai sản xuất, tôi luôn sao lưu toàn bộ thư mục chứa trước.Tôi đã có thể sao chép toàn bộ cấu trúc thư mục của mình trở lại trạng thái ban đầu và mọi thứ hoạt động tốt.

Ghi chú thận trọng với phương pháp này:

  • sao lưu của bạn sẽ lớn nếu ứng dụng là khá lớn, hoặc có rất nhiều các phiên bản đã được công bố trong thư mục hồ sơ. Hãy chắc chắn rằng bạn có đủ chỗ (cho tôi lưu trữ là không có đối tượng).
  • Quyền có xu hướng khó chịu khi cắn bạn theo cách này. Đảm bảo nếu vị trí triển khai của bạn được lưu trữ để truy cập bên ngoài mà bạn xác minh tất cả các quyền trước và sau khi khôi phục.
  • Tôi rất hữu ích khi tái chế hồ bơi ứng dụng của mình theo số IIS.
0

Điều này có thể được thực hiện qua phản ánh nếu bạn biết nhà xuất bản URI và tên, mã khóa công khai ngôn ngữ phiên bản và kiến ​​trúc bộ xử lý của cả triển khai và ứng dụng.

Mã bên dưới sẽ cố gắng khôi phục ứng dụng "coolapp.app" ClickOnce. Nếu nó không thể quay trở lại, nó sẽ cố gắng gỡ bỏ nó.

using System; 
using System.Deployment.Application; 
using System.Reflection; 

namespace ClickOnceAppRollback 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     static void Main() 
     { 
      string appId = string.Format("{0}#{1}, Version={2}, Culture={3}, PublicKeyToken={4}, processorArchitecture={5}/{6}, Version={7}, Culture={8}, PublicKeyToken={9}, processorArchitecture={10}, type={11}", 
       /*The URI location of the app*/@"http://www.microsoft.com/coolapp.exe.application", 
       /*The application's assemblyIdentity name*/"coolapp.app", 
       /*The application's assemblyIdentity version*/"10.8.62.17109", 
       /*The application's assemblyIdentity language*/"neutral", 
       /*The application's assemblyIdentity public Key Token*/"0000000000000000", 
       /*The application's assemblyIdentity processor architecture*/"msil", 
       /*The deployment's dependentAssembly name*/"coolapp.exe", 
       /*The deployment's dependentAssembly version*/"10.8.62.17109", 
       /*The deployment's dependentAssembly language*/"neutral", 
       /*The deployment's dependentAssembly public Key Token*/"0000000000000000", 
       /*The deployment's dependentAssembly processor architecture*/"msil", 
       /*The deployment's dependentAssembly type*/"win32"); 

      var ctor = typeof(ApplicationDeployment).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(string) }, null); 
      var appDeployment = ctor.Invoke(new object[] { appId }); 

      var subState = appDeployment.GetType().GetField("_subState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment); 
      var subStore = appDeployment.GetType().GetField("_subStore", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(appDeployment); 
      try 
      { 
       subStore.GetType().GetMethod("RollbackSubscription").Invoke(subStore, new object[] { subState }); 
      } 
      catch 
      { 
       subStore.GetType().GetMethod("UninstallSubscription").Invoke(subStore, new object[] { subState }); 
      } 
     } 
    } 
} 
1

Tôi hiểu ClickOnce phiên bản kiểm tra algorythm như sau:

  1. Nếu phiên bản cài đặt trên client = phiên bản triển khai đến máy chủ - không làm gì cả
  2. Nếu phiên bản client phiên bản < máy chủ - nâng cấp
  3. Nếu phiên bản máy khách> phiên bản máy chủ:
    1. Nếu minimumVersion được chỉ định trên máy khách> = phiên bản máy chủ - hiển thị lỗi khi chúng tôi có
    2. Nếu minimumVersion định trên client < máy chủ phiên bản - hạ cấp
    3. Nếu minimumVersion không được xác định trên máy khách - hạ cấp