2013-04-30 14 views
8

Tôi cần một số cài đặt của ứng dụng sẽ được chia sẻ giữa tất cả người dùng máy tính, nhưng cũng có thể thay đổi tại thời điểm chạy. Đường may đó đơn giản, nhưng theo số Application Settings MSDN article, nó là cái này hay cái kia.Cách cài đặt ứng dụng được chia sẻ cho tất cả người dùng có thể thay đổi vào thời gian chạy

Có hai loại cài đặt ứng dụng, dựa trên phạm vi:

  • Cài đặt ứng dụng-scoped có thể được sử dụng cho thông tin như một URL cho một dịch vụ Web hoặc một chuỗi kết nối cơ sở dữ liệu. Các giá trị này được liên kết với ứng dụng. Do đó, người dùng không thể thay đổi chúng trong thời gian chạy.

  • Cài đặt phạm vi người dùng có thể được sử dụng để biết thông tin như duy trì vị trí cuối cùng của biểu mẫu hoặc tùy chọn phông chữ. Người dùng có thể thay đổi các giá trị này tại thời gian chạy.

tôi có thể viết code để chỉnh sửa các tập tin XML App.config, nhưng vì nó nằm trong thư mục chương trình, nó được bảo vệ dưới cửa sổ 7. Vì vậy, đây không phải là có thể mà không nâng cao chương trình hoặc chơi với NTFS quyền.

Vì vậy, tôi cần tệp cấu hình được viết trong một thư mục chung như System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData).

Nhưng đây là một yêu cầu khá phổ biến!

Vì vậy, tôi tự hỏi nếu có một cách đơn giản để đạt được điều này mà không cần phát minh lại bánh xe, hoặc nếu tôi phải viết Trình quản lý thiết lập của riêng mình.

Trả lời

4

Tôi đã gặp sự cố tương tự và đã kết thúc viết lớp cài đặt của riêng mình. Nó rất cơ bản. Tôi tạo ra một lớp Settings với các thuộc tính tôi cần, và một SettingsManager với Save() và Load() phương pháp mà chỉ đơn giản là serialized/deserialized các đối tượng thông qua XmlSerializer vào/từ một tập tin. Có, nó là mã của riêng bạn, nhưng nó là mã rất đơn giản, mất ít thời gian hơn là cố gắng tìm hiểu xem có một thành phần cung cấp những gì bạn cần và làm thế nào để tùy chỉnh nó.

+0

Bạn có thể chia sẻ mã của mình không? –

+0

Xem ví dụ ở đây về cách thực hiện việc này: https://msdn.microsoft.com/en-gb/library/ms973902.aspx#persistappsettnet_creatingcustomclass – Simon

1

Cơ sở hạ tầng Cài đặt ứng dụng không hỗ trợ điều này - chỉ hỗ trợ dữ liệu ứng dụng không thể chỉnh sửa và dữ liệu do người dùng điều chỉnh. Bạn có thể dễ dàng đọc và viết XML của riêng mình vào các thư mục CommonApplicationData, tuy nhiên, thay vì sử dụng dữ liệu ứng dụng.

+0

Có ý nghĩa nếu tôi thay thế 'dữ liệu' bằng 'Cài đặt', nhưng bạn có thể mở rộng câu cuối cùng không?Về cơ bản bạn có nghĩa là tôi cần phải viết * Trình quản lý thiết lập * của riêng mình, đảm bảo rằng tôi đã tạo một thư mục để giữ tệp cấu hình trong 'CommonApplicationData' và viết/đọc XML trên đó. Không phải lớp tôi có thể dễ dàng kế thừa từ hoặc giao diện mà tôi có thể thực hiện để hoàn thành công việc đó? – DavRob60

+0

@ DavRob60 Không - không có "Trình quản lý cài đặt" được xây dựng trong bộ điều khiển đó, thật không may. Bạn chỉ có thể sử dụng XDocument (http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx) và tương tự như việc đọc/ghi từ XML đơn giản. –

+0

Điều gì về [Lớp cài đặt chuyên biệt] (http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider%28v=vs.100%29.aspx)? Có cái gì đó để xây dựng xung quanh đó, nó là một cái gì đó hoàn toàn khác nhau hoặc nó không wroth rắc rối để cố gắng để gây rối với điều đó? – DavRob60

2

Sau khi đọc câu trả lời ở đây và chơi với các ConfigurationManager.Open phương pháp tôi đã kết thúc như sau:

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyApp", "MyApp.config"); 
Configuration MyAppConfig = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = path }, ConfigurationUserLevel.None); 

Phần tốt đẹp là tập tin không nhất thiết phải tồn tại, và nếu bạn gọi Save() vào nó, nó sẽ tạo thư mục và tệp cho bạn. AppSettings["key"] đã không làm việc mặc dù vậy tôi đã phải sử dụng

MyAppConfig.AppSettings.Settings["key"].Value 

để đọc và viết một giá trị hiện có và

MyAppConfig.AppSettings.Settings.Add("key", value) 

để thêm một giá trị mới.

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