2011-02-11 16 views
12

Bối cảnh:
Tôi có một ứng dụng chính mà cần phải có khả năng hãy vào trang web và tải về các file DLL liên kết với nó (những cái mà chúng tôi viết, nằm trên máy chủ của chúng tôi). Nó thực sự cần để có thể tải xuống các tệp DLL này vào thư mục ứng dụng trong "C: \ Program Files \". Trước đây tôi đã sử dụng System.Net.WebClient để tải xuống bất kỳ tệp nào tôi muốn từ web.Một câu hỏi về cách viết một nền tảng/tự động/im lặng downloader/cài đặt cho một ứng dụng trong C#

Số phát hành
Tôi gặp khó khăn khi tải xuống dữ liệu trong quá khứ và lưu vào tệp trên ổ cứng của người dùng. Tôi nhận được nhiều báo cáo của người dùng nói rằng điều này không hiệu quả và thường là do các vấn đề về quyền của người dùng trong chương trình.

Trong trường hợp đó là vấn đề với quyền người dùng chương trình, mỗi người dùng có thể đi đến vị trí tệp chính xác trên web, tải xuống và sau đó lưu nó vào đúng vị trí theo cách thủ công.

Tôi muốn tính năng này hoạt động giống như tất cả các chương trình khác mà tôi đã tải xuống/cài đặt trong phần này (ví dụ: Cập nhật Firefox Pluign, Flash Player, JAVA, Adobe Reader, v.v.). Tất cả những công việc này mà không có một xô.

Câu hỏi
Có một số mã tôi cần sử dụng để cung cấp cho chương trình người tải xuống quyền đặc biệt của mình vào thư mục Tệp Chương trình không? Tôi thậm chí có thể làm điều này? Có một lớp học hay thư viện tốt hơn mà tôi nên sử dụng không? Có cách tiếp cận khác để tải xuống các tệp tôi nên thực hiện hay không, chẳng hạn như sử dụng chủ đề hoặc nội dung khác để tải xuống dữ liệu?

Mọi trợ giúp ở đây đều được đánh giá cao. Tôi muốn cố gắng tránh xa các ứng dụng/thư viện của bên thứ ba nếu có thể, ngoài Microsoft tất nhiên, do các vấn đề cấp phép, nhưng vẫn gửi bất kỳ đề xuất nào theo cách của tôi.

Một lần nữa, các chương trình khác dường như có các vấn đề về quyền và khả năng tải xuống được tìm ra. Tôi muốn khả năng này.

+0

vâng ... đây là một câu hỏi hay. Trên máy Mac, tôi sẽ sử dụng Sparkle http://sparkle.andymatuschak.org/ nhưng tôi tò mò muốn xem có bất kỳ thứ gì giống như được phát triển cho .NET không. – phillip

+0

Nhấp một lần là cách để thực hiện trong trường hợp này. Đó là nghĩa đen nhấp một lần. Mỗi khi ứng dụng của bạn bắt đầu, ứng dụng sẽ kiểm tra máy chủ của bạn để xem liệu có bản cập nhật hay không và tự động cập nhật ứng dụng hoặc tệp. –

+0

@Shiv: ClickOnce không cài đặt vào 'Program Files', tức là nó chỉ cài đặt ứng dụng cho người dùng hiện tại. – Heinzi

Trả lời

3

Cách thông thường để làm điều này đi như thế này:

  1. Ứng dụng của bạn phát hiện rằng một bản cập nhật là cần thiết.
  2. Ứng dụng của bạn bắt đầu một ứng dụng (cập nhật) khác, sẽ tải xuống các tệp cần thiết và cài đặt chúng vào Program Files. Ứng dụng cập nhật này phải chạy với quyền quản trị (tức là, nhắc cho độ cao UAC trong Vista/Win7). Cách dễ nhất để đảm bảo điều này là add an application manifest to that updater application.

Nếu người dùng là quản trị viên đã bật UAC, điểm 2 sẽ gây ra lời nhắc UAC xuất hiện phải được chấp nhận (lưu ý rằng điều này cũng đúng với Firefox/Acrobat/etc. Updaters). Nếu người dùng không phải là quản trị viên, anh ta sẽ được yêu cầu thông tin đăng nhập của quản trị viên. (Lưu ý rằng đây là một điều tốt: Chỉ quản trị viên mới được phép nâng cấp các ứng dụng được cài đặt cho tất cả người dùng.)

Ứng dụng cập nhật của bạn không cần phải được viết theo cách đặc biệt: Có thể sử dụng System.Net.WebClient giống như trước đây. Tệp kê khai ứng dụng sẽ đảm bảo rằng nó yêu cầu tiền hoa hồng bắt buộc để ghi vào Program Files. Lưu ý rằng vấn đề này (Program Files không được ghi bởi người quản trị không có độ cao UAC) là một tính năng của hệ điều hành và không phải là giới hạn ngôn ngữ lập trình, do đó bạn sẽ không giải quyết vấn đề này chỉ bằng cách sử dụng thư viện khác. Nếu bạn muốn ứng dụng của mình chạy trên Vista/Win7 và ghi vào Program Files, bạn sẽ cần độ cao UAC.

+0

+1 cho "là một tính năng của hệ điều hành và không phải là giới hạn ngôn ngữ lập trình" –

+0

Tôi nhìn rất nhiều vào đây và đây là phương pháp tốt nhất và được sử dụng rộng rãi nhất. –

0

Ghi vào thư mục Tệp Chương trình yêu cầu độ cao UAC (nếu người dùng đã bật) trên Vista/Win7. Xem mẫu mã này về cách nhắc người dùng cho phép: http://msdn.microsoft.com/en-us/library/aa970890.aspx

Thực sự, hãy suy nghĩ về cách thiết kế ứng dụng của bạn để nó ghi vào một nơi thích hợp hơn mà không có nguy cơ vô tình ghi đè tệp chương trình quan trọng.

+0

Các chương trình như Adobe Reader và JAVA cài đặt các tệp của họ ở đâu? Tôi nghĩ rằng họ đã tải xuống và cài đặt các tệp của họ vào thư mục của họ trong "Program Files". –

+0

Ah, xin lỗi tôi nghĩ bạn đã tải xuống tài liệu. Để tải xuống các tệp DLL cho ứng dụng của riêng bạn, Tệp Chương trình có ý nghĩa –

+0

Bài học quan trọng ở đây là làm phát triển (hoặc ít nhất là thử nghiệm của bạn) từ tài khoản không phải quản trị viên với UAC được bật hoàn toàn. –

-2

Đừng làm điều đó.

Về mặt lý thuyết, có thể thực hiện dễ dàng. bạn chỉ cần ăn trưa một ứng dụng khác, chạy với các đặc quyền quản trị - bạn có thể yêu cầu chúng trong cấu hình. Trong ứng dụng cập nhật, bạn chỉ cần kết nối với một trang web an toàn (ssl), tải xuống mọi thứ bạn cần, các tệp bạn tải xuống phải được ký mã hóa.

Điều này cũng có thể dễ dàng được giải quyết bằng cách sử dụng ClickOnce hoặc một số trình cài đặt web khác, có khả năng cập nhật.

Điều bạn không nên làm là chỉ tải xuống tệp DLL không an toàn từ nguồn chưa được xác minh và thực thi chúng.

0

Thực sự có cần phải ở trong Tệp chương trình không? Tôi đã có một vấn đề tương tự trong một ứng dụng, và chúng tôi đã viết một lớp để giải quyết các hội đồng không được cài đặt bằng cách đầu tiên cố gắng tải chúng từ một thư mục con của% usersprofile%, sau đó bằng cách cố tải xuống. Điều này có thể liền mạch nếu bạn thêm bạn giải quyết phương thức cho sự kiện AssemblyResolve của miền ứng dụng hiện tại.

AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve; 
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     //try to get locally 

     //try to download 
     return assembly; 
    } 
Các vấn đề liên quan