2009-04-16 46 views
22

Tôi có một số cài đặt trong app.config mà tôi dự định là 'toàn cầu' - nghĩa là. bất kỳ người dùng nào cũng có thể thay đổi họ và tất cả người dùng đều có cùng cài đặt.Tại sao cài đặt ứng dụng chỉ đọc trong app.config?

Nhưng trừ khi tôi thay đổi chúng thành cài đặt người dùng, chúng chỉ được đọc.

Tại sao điều này?

Và làm cách nào để tôi tiếp tục duy trì cài đặt chung của ứng dụng?

Edit:

Đây thực sự là một ứng dụng dịch vụ cửa sổ mà chạy như một dịch vụ như LocalSystem. Nó cũng có thể được chạy thủ công bởi một quản trị viên cục bộ với đối số "/ config", nó sẽ khởi chạy một biểu mẫu cửa sổ để chỉnh sửa các giá trị cấu hình.

Vì vậy, nó sẽ có quyền ghi vào %PROGRAMFILES% trong cả hai trường hợp.

Con đường tôi đang truy cập cài đặt của tôi là thusly:

Settings.Default.MySetting = MyNewValue; 

Và khi MySetting được thiết lập để ứng dụng (trong thuộc dự án của tôi, Settings.settings), tôi nhận được một lỗi thời gian biên dịch "MySetting được đọc chỉ có".

Tôi mới sử dụng công cụ này và chưa tìm thấy giải thích tốt về cách thực hiện. Ví dụ: tại sao tôi cần phải nói 'Mặc định' và điều đó thực sự có ý nghĩa gì? Tôi không có ý kiến. Nếu bất cứ ai có thể chỉ cho tôi một hướng dẫn sử dụng app.config, điều đó sẽ thực sự hữu ích.

Trả lời

47

Câu trả lời hoàn toàn thật:

Các thiết lập app.config là chỉ đọc vì có 2 kiểu cài đặt:

  1. Cài đặt ứng dụng
  2. User Settings

Các đầu tiên sẽ không thay đổi trừ khi nhà xuất bản ứng dụng xuất bản phiên bản mới của nó. Cái thứ hai không được lưu trữ trong app.config, nhưng trong một tệp user.config. Trong sự tập trung của tập tin user.config này, app.config cung cấp giá trị mặc định.

Nếu MySetting là cài đặt User:

Settings.Default.MySetting = MyNewValue; 
Settings.Default.Save(); 

Nó sẽ tạo ra một file user.config tại [User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version] với các thiết lập mới, và những thiết lập này sẽ được áp dụng trên các thiết lập trong file app.config.

+1

Điều này sẽ được đánh dấu là "Trả lời". Rất tốt giải thích. – Askolein

+0

Xin chào. Bạn có thể xem câu hỏi này không? http://stackoverflow.com/questions/39791332/application-creates-folder-with-in-place-for-space-in-name-when-using-proper – Pritam

4

Lý do: Cài đặt ứng dụng được dự định sẽ được lưu trữ trong thư mục Ứng dụng trong Tệp chương trình mà người dùng không có đặc quyền ghi.

Làm thế nào: Không có hỗ trợ mặc định cho "Tất cả người dùng" nhưng bạn có thể thiết lập tệp cấu hình tùy chỉnh của riêng mình trong thư mục công cộng hoặc sử dụng Cơ sở dữ liệu.

1

Không hoàn toàn chắc chắn ý của bạn ở đây. Bạn có nghĩa là bạn cho phép người dùng thay đổi app.config từ giao diện người dùng và các thay đổi không được duy trì không?

bạn đã gọi

ConfigurationManager.RefreshSection("appSettings"); 

Configuration.Save(); 
+1

Xem chỉnh sửa của tôi. Tôi đang sử dụng Settings.Default, không ConfigurationManager - hiện nó đọc app.config? – Blorgbeard

0

Một lý do là file app.config nằm trong thư mục của ứng dụng của bạn trong thư mục Program Files, và tất cả mọi thứ trong Program Files là chỉ đọc cho người dùng chuẩn theo mặc định.

Khác là cài đặt app.config áp dụng hệ thống rộng. Nếu một người dùng thực hiện thay đổi, nó sẽ tác động đến những người dùng khác. Người dùng bình thường không được phép tạo ra loại thay đổi đó. Bất kỳ điều gì có thể ảnh hưởng đến nhiều người dùng chỉ nên được đặt là quản trị viên hệ thống. Cài đặt cho mỗi người dùng nằm trong thư mục Dữ liệu ứng dụng của từng người dùng.

+0

OK - tôi chỉ muốn quản trị viên hệ thống có thể thay đổi các cài đặt trên toàn hệ thống này trong chương trình của tôi. Nhưng nó không có vẻ như có thể, ngay cả khi tôi đang chạy như admin. – Blorgbeard

0

Cài đặt cấu hình được lưu trong bộ nhớ cache khi bạn khởi động ứng dụng. bạn có thể xử lý tệp app.config dưới dạng xml để thay đổi các giá trị.

3

Chỉ cần đặt: Không có vị trí trên máy mà mọi người đều có thể thay đổi, trừ khi bạn cấp đặc quyền để làm như vậy.

Có một số cách để đối phó với tình huống này:

  • Bạn có thể tạo một tập tin cấu hình/một số thiết lập registry, đặt này trong "all users" hồ sơ và cấp "Mọi người" quyền để thay đổi tệp cụ thể đó. Trong khi cài đặt, bạn có thể tự động hóa thủ tục cấp quyền ưu tiên và chương trình của bạn có thể xử lý phần còn lại.

  • Bạn có thể tận dụng UAC để đảm bảo người dùng hiện tại có đặc quyền thích hợp để thay đổi cài đặt trên toàn hệ thống. Đây là phương pháp được khuyến nghị nhưng cũng có nghĩa là không phải ai cũng có thể thay đổi cài đặt cụ thể.

  • Bạn có thể sử dụng cơ sở dữ liệu được chia sẻ và lưu trữ cài đặt của mình trong đó.

  • ???

Tôi không khuyên bạn nên thay đổi các mục trong thư mục tệp chương trình hoặc thay đổi đặc quyền mặc định vượt quá.

EDIT: Là hệ thống cục bộ, bạn thực sự đã viết đặc quyền vào thư mục tệp chương trình. Nếu bạn gặp lỗi "Chỉ đọc", điều đó có nghĩa là chính cài đặt đó chỉ được đọc. Bạn sẽ cần sử dụng trình quản lý cấu hình để có thể thay đổi cài đặt trong các tệp cấu hình.

Hy vọng điều này sẽ hữu ích.

+0

Bạn có thể mở rộng trên "sử dụng trình quản lý cấu hình" không? Bất kỳ liên kết hữu ích nào? – Blorgbeard

+1

Chắc chắn, hãy xem tại đây: http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx –

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