2008-09-29 19 views
31

Tôi có một số ứng dụng .NET Windows Forms mà tôi đang chuẩn bị chuyển đổi thành một tình huống triển khai ClickOnce/smart-client. Tôi đã đọc các hướng dẫn không phải là tuyệt vời này, nhưng có những cạm bẫy hay "gotchas" mà tôi nên biết?Cạm bẫy/công việc triển khai ClickOnce/smart-client trong .NET

Có một số ứng dụng nhỏ được sử dụng tắt và bật, nhưng ứng dụng chính là trong C#, chạy 24/7, khá lớn, nhưng chỉ thay đổi vài tuần một lần. Nó cũng ghi vào một tập tin log locallly và nói chuyện với các thiết bị phần cứng địa phương.

+0

đóng là 'không mang tính xây dựng' - nhưng câu trả lời cho câu hỏi này cực kỳ hữu ích đối với tôi ...quyết định không sử dụng ClickOnce triển khai;) –

+0

Tôi đọc nhiều người phàn nàn về clickonce, mọi thứ đã thay đổi kể từ đó, đừng để những câu trả lời đe dọa bạn, nó rất dễ dàng để thiết lập và có lợi thế tốt – meda

Trả lời

12

Dưới đây là một vài điều tôi biết.

  1. Không thể đặt biểu tượng trên màn hình. Bây giờ bạn có thể.

  2. Tôi không thể cài đặt cho tất cả người dùng.

  3. Tôi cần phải nhảy qua các vòng để di chuyển triển khai sang một máy chủ khác. Nó không phải là một vấn đề nếu bạn đang phát triển nội bộ, và người dùng có thể thấy máy chủ mà bạn đang xuất bản hoặc nếu bạn đang triển khai lên web công cộng, nhưng nó không tuyệt vời nếu bạn cần phải triển khai nhiều trang khách hàng một cách độc lập.

  4. Kể từ .NET 3.5 SP1 bạn không cần phải ký vào tệp kê khai triển khai nữa, giúp việc triển khai các máy chủ mới dễ dàng hơn nhiều.

  5. Tôi không thể cài đặt các hội đồng trong số GAC. Bạn có thể giải quyết vấn đề này bằng cách tạo các gói cài đặt thường xuyên là các điều kiện tiên quyết của ứng dụng ClickOnce.

+0

mà không cần cài đặt lại) trừ khi bạn đang sử dụng .NET 3.5 SP1. –

+0

Thực ra, bạn CÓ THỂ di chuyển nó đến một máy chủ khác chỉ bằng cách xuất bản nó với một URL cập nhật mới (xem http://robindotnet.wordpress.com/2010/01/17/how-to-move-a-clickonce-deployment/). Và bạn có thể cài đặt các assembly trong GAC bằng cách đặt chúng vào một gói cài đặt và triển khai và triển khai chúng như một điều kiện tiên quyết. – RobinDotNet

+0

@RobinDotNet Thật không dễ dàng để xuất bản từ môi trường xây dựng của chúng tôi trực tiếp đến máy chủ nội bộ của nhiều khách hàng. Dù sao, .net3.5 sp1 đã khắc phục mọi sự cố của tôi bằng cách xóa yêu cầu ký. –

4

Một trong những cạm bẫy với ClickOnce là thực tế bạn không thể cài đặt vào GAC. Đây là vấn đề nếu bạn muốn cài đặt nhiều ứng dụng chia sẻ tệp DLL. Mỗi ứng dụng sẽ yêu cầu một bản sao cục bộ của các tệp DLL. Ngoài ra, nhiều lượt cài đặt của người dùng đã hết. Xem the list comparing Window Installer to ClickOnce.

+0

Nếu dll được đặt tên mạnh, ClickOnce lưu trữ chúng. Vì vậy, nếu bạn có nhiều ứng dụng sử dụng cùng một dll (chúng tôi có một số, bao gồm cả log4net), ClickOnce sẽ giữ chỉ là một bản sao của nó trong bộ nhớ cache. – RobinDotNet

6

Chúng tôi đã có một ứng dụng mà chúng tôi sẽ triển khai dưới dạng ứng dụng ClickOnce. Chúng tôi cần người dùng có thể sửa đổi một số cài đặt trong quá trình cài đặt (chẳng hạn như đường dẫn triển khai - CNTT muốn phân phát các tệp từ mạng chia sẻ của họ, không biết lúc xây dựng). Khi bạn thay đổi bất kỳ tệp nào trong triển khai của mình, bạn cần phải tính toán lại tất cả các băm, và ký lại mọi thứ. Vì vậy, nếu giải pháp này là nội bộ, bạn có thể không gặp vấn đề gì khi đi qua một cert ký tên, nhưng nếu điều này là dành cho khách hàng, bạn sẽ cần kiến ​​trúc sư một giải pháp lạ mắt để bỏ qua vấn đề này.

Tôi đã nghe những lời rumblings từ đâu đó trong ruột của internets rằng một phiên bản tương lai của ClickOnce sẽ loại bỏ một số nhức đầu này.

+1

Tôi hy vọng những tiếng lầm bầm bạn nghe là chính xác ... đây là một vấn đề lớn đối với chúng tôi! – Aaron

3

Có rất nhiều thứ bạn không thể làm với các ứng dụng ClickOnce, như cài đặt phím tắt cho màn hình của người dùng hoặc có bất kỳ lời nói nào trong đó ứng dụng được cài đặt. Đối với một số người, đây là những người giao dịch.

Cũng đã một thời gian kể từ khi tôi sử dụng nó, nhưng có một cách đặc biệt bạn có thể sử dụng để tìm ra và hiển thị số phiên bản/số dựng ClickOnce, tách biệt với số phiên bản/số của ứng dụng. Bạn phải thực hiện try/catch và nếu số phiên bản/phiên bản ClickOnce ném một ngoại lệ thì ứng dụng không chạy như một ứng dụng được triển khai ClickOnce (có nghĩa là nó đang chạy như một ứng dụng được biên dịch thường xuyên hoặc từ Visual Studio).

Đối với một ứng dụng đơn giản (nghĩa là, không phải Microsoft Word, mà là ứng dụng nhanh và bẩn) và cần triển khai thường xuyên, ClickOnce rất tuyệt. Nhưng bạn khá nhanh chóng tung ra bức tường của "oh, điều này không thể được thực hiện bằng ClickOnce, hãy chọn MSI hay cái gì khác).

+3

Thay vì sử dụng Try/Catch khi cố gắng lấy số phiên bản đã triển khai, hãy bọc nó trong "Nếu System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed Then..." Sạch hơn nhiều. Nếu mạng của nó được triển khai, bạn có thể tải phiên bản. Nếu không, bạn không thể. Easy-peasy :) –

3

Bạn sẽ có quyền truy cập hệ thống ít hơn ứng dụng .NET bình thường của bạn.

Đó là vì bạn sẽ nhận được mức độ tin cậy thấp hơn. Thêm thông tin về điều đó trong .NET Framework Developer's Guide: ClickOnce Deployment and Security.

Vấn đề lớn nhất của tôi là không thể mã hóa các phần của tệp cấu hình bằng phím máy, vì bạn không có quyền truy cập vào khóa đó (khi bạn nghĩ về nó, điều đó có ý nghĩa để bảo vệ khóa đó)

+2

Hmm, không chắc ... bạn có thể yêu cầu mức độ tin cậy cao hơn, người dùng chỉ có thể nhận được hộp thoại cảnh báo. Bạn có thể mã hóa các phần của tệp cấu hình trong mã trên lần chạy đầu tiên, nhưng không phải trong quá trình triển khai, vì đó là khóa của máy triển khai chứ không phải của máy khách mà khách hàng không thể đọc được. –

+0

Đúng, nhưng để giải mã nó, bạn luôn phải có mức độ tin tưởng cao hơn .... –

7

Hầu hết các vấn đề đã được giải quyết nhưng một số người đã đề cập không thể tạo lối tắt trên màn hình. Trên thực tế, bạn can create a desktop shortcut with Visual Studio 2008 SP1.

Ngoài ra, nếu bạn không sử dụng phiên bản Visual Studio mới nhất, bạn luôn có thể write code to create a shortcut to the installed start menu shortcut.

+3

Mặc dù, thật đáng buồn, nó sẽ không bị gỡ cài đặt một cách sạch sẽ. –

3

Trong trường hợp ai đó đề cập đến điều này trong tìm kiếm, chúng tôi đã tìm thấy nhiều khách hàng quan tâm đến việc thiếu bảo mật 'phân phối' ứng dụng của họ. Ứng dụng phải có sẵn ở nơi công cộng - không có bất kỳ xác thực nào - để ứng dụng có thể kiểm tra các bản cập nhật. Ngoại lệ duy nhất là nếu bạn có xác thực Windows NT. Tôi nghĩ rằng Securing ClickOnce Applications giải thích ý tôi là gì.

Biểu tượng trên máy tính để bàn khá tầm thường để thực hiện qua mã và như đã đề cập, với 3.5 SP1, được nướng trong - do đó không còn là vấn đề nữa.

Vẫn còn một lỗi chưa được vá với xmlSerializer - nó không được triển khai đúng trong một số trường hợp. Cách giải quyết dễ dàng là tự thêm tệp này vào triển khai. Pita, nhưng nó là đủ dễ dàng ... Nó có thể gây sốc khi triển khai của bạn đột nhiên bị lỗi mặc dù ...

9
  • Khi cập nhật được triển khai, được xây dựng trong hộp thoại sẽ làm cho nó xuất hiện như là nếu toàn bộ ứng dụng đang được tải xuống lại. Trong thực tế, chỉ có các DLL đã thay đổi đang được tải xuống và thanh tiến trình được hiển thị là sai lệch/sai. Đừng lãng phí thời gian cố gắng tìm ra lý do tại sao tất cả các hội đồng đang được tái triển khai chỉ để khám phá ra rằng họ thực sự không. Không phải là tôi đã làm điều đó hay bất cứ điều gì.
  • Khi chứng chỉ mà bạn sử dụng để ký bản kê khai triển khai gốc hết hạn và bạn được cấp một chứng chỉ mới, bạn đang ở trong một thế giới bị tổn thương (tất cả khách hàng sẽ cần gỡ cài đặt và cài đặt lại). Chi tiết are at the horse's mouth.
4

Bạn không thể cài đặt thầm lặng các ứng dụng được triển khai ClickOnce. Ngoài ra tôi nghĩ rằng không thể thêm tham số vào shortcut khởi động.

3

Tôi không biết rằng SP1 cho phép bạn tạo biểu tượng máy tính để bàn. Đây là cách chúng tôi đã làm việc đó (bây giờ gọi là "con đường khó"):

  try 
     { 
      string company = string.Empty; 
      string product = string.Empty; 
      if (Attribute.IsDefined(asm, typeof(AssemblyCompanyAttribute))) 
      { 
       AssemblyCompanyAttribute asCompany = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyCompanyAttribute)); 
       company = asCompany.Company; 
      } 
      if (Attribute.IsDefined(asm, typeof(AssemblyProductAttribute))) 
      { 
       AssemblyProductAttribute asProduct = (AssemblyProductAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyProductAttribute)); 
       product = asProduct.Product; 
      } 
      if (!string.IsNullOrEmpty(company) && !string.IsNullOrEmpty(product)) 
      { 
       string desktopPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
        product + ".appref-ms"); 
       string shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), 
        Path.Combine(company, product + ".appref-ms")); 
       File.Copy(shortcutPath, desktopPath, true); 
      } 
     } 
     catch 
     { 
      // Shortcut could not be created 
     } 
+0

SP1 của cái gì? .NET 3.5? –

1

Bạn không thể cài đặt nếu khách hàng là đằng sau một proxy yêu cầu xác thực.

+0

Có thể. Có một cách giải quyết khác. Hãy xem phần cuối của chuỗi này: http://social.msdn.microsoft.com/Forums/en/winformssetup/thread/3e9cebad-9630-4bbc-a0ca-0d2f20335454 – RobinDotNet

+0

Xin chào Robin, nếu bạn đang đề cập đến bài đăng của chính mình Có - đó là giới hạn để nâng cấp chỉ là nó không? Nhận xét của tôi liên quan đến bản cài đặt ban đầu mà bạn tự nói với mình, sau đó bạn phải thực hiện bằng USB/CD, v.v. với cách giải quyết này. Tôi thực sự tình cờ gặp bài viết đó vào ngày hôm kia trong khi làm việc về vấn đề này, và tạm thời vui mừng như một giải pháp. Nhưng đối với một ứng dụng được triển khai trên Internet như của chúng tôi (http://www.qiqqa.com), nó thực sự không giúp ích gì cho bạn. – Nik

Các vấn đề liên quan