2009-02-07 39 views
6

Tôi có dự án thiết lập Visual Studio có lớp Trình cài đặt. Trong lớp trình cài đặt, tôi đặt một cài đặt như sau:Làm cách nào để đặt cài đặt ứng dụng tại thời điểm cài đặt (thông qua lớp trình cài đặt)

 MessageBox.Show(Properties.Settings.Default.MySetting); 

     Properties.Settings.Default.MySetting = "Foo"; 
     Properties.Settings.Default.Save(); 

     MessageBox.Show(Properties.Settings.Default.MySetting); 

Vấn đề là mặc dù tôi biết mã này đang được thực hiện (tôi đang làm các công cụ khác), cài đặt này chưa bao giờ được đặt !!

Các hộp thông báo đề xuất rằng giá trị đang được đặt, nhưng khi tôi chuyển đến tệp .config thì giá trị vẫn trống!

Bất kỳ ai cũng có bất kỳ ý tưởng nào về lý do và/hoặc giải pháp có thể có?

Trả lời

4

Những gì tôi làm cho trình cài đặt của mình là sử dụng thuộc tính "tệp" trong App.Config. Khối appSettings có thuộc tính "tệp", như vậy:

<appSettings file="user.config"> 
    <add key="foo" value="some value unchanged by setup"/> 
</appSettings> 

Thuộc tính "tệp" giống như CSS, trong đó cài đặt cụ thể nhất sẽ thắng. Nếu bạn có "foo" được định nghĩa trong user.config cũng như App.config, giá trị trong user.config được sử dụng.

Sau đó, tôi có trình tạo cấu hình viết ra khối appSettings thứ hai cho user.config (hoặc bất kỳ thứ gì bạn muốn gọi), sử dụng các giá trị trong từ điển.

using System.Collections.Generic; 
using System.Text; 
using System.Xml; 

namespace Utils 
{ 
    public class ConfigGenerator 
    { 
     public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration) 
     { 
      using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8)) 
      { 
       xw.Formatting = Formatting.Indented; 
       xw.Indentation = 4; 
       xw.WriteStartDocument(); 
       xw.WriteStartElement("appSettings"); 

       foreach (KeyValuePair<string, string> pair in userConfiguration) 
       { 
        xw.WriteStartElement("add"); 
        xw.WriteAttributeString("key", pair.Key); 
        xw.WriteAttributeString("value", pair.Value); 
        xw.WriteEndElement(); 
       } 

       xw.WriteEndElement(); 
       xw.WriteEndDocument(); 
      } 
     } 
    } 
} 

Trong cài đặt của bạn, chỉ cần thêm một cái gì đó như sau trong phương pháp cài đặt của bạn:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar); 

IDictionary<string, string> userConfiguration = new Dictionary<string, string>(); 

userConfiguration["Server"] = Context.Parameters["Server"]; 
userConfiguration["Port"] = Context.Parameters["Port"]; 

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration); 

Chúng tôi sử dụng nó cho kiểm tra, đào tạo, và các máy chủ sản xuất của chúng tôi, vì vậy tất cả chúng ta phải làm là xác định tên máy và mật khẩu trong quá trình cài đặt và mọi thứ đều được chúng tôi quan tâm. Nó được sử dụng để là một quá trình 3 giờ, bao gồm đi qua nhiều tập tin cấu hình để thiết lập mật khẩu. Bây giờ nó gần như hoàn toàn tự động.

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

+0

Cảm ơn vì điều này, nó trông giống như loại giải pháp mà tôi theo sau. Mặc dù tôi đã gặp sự cố, nếu tôi ghi đè lên phương thức Cài đặt trong trình cài đặt của mình, các giá trị từ giao diện người dùng tùy chỉnh không nằm trong các tham số ngữ cảnh. Tôi có sử dụng đúng phương pháp không? Chúc mừng – MrEdmundo

+0

Bỏ qua điều đó, tôi đã không chuyển dữ liệu từ giao diện người dùng trong màn hình chỉnh sửa CustomActions. – MrEdmundo

0

Tôi thành thật không biết liệu điều này có được hỗ trợ trong trình cài đặt hay không - nhưng nếu có, hãy đảm bảo bạn đang gọi số Save() trên Settings.Default.

+0

Tôi đã đặt cài đặt Lưu nhưng mặc dù giá trị này không thực sự được đặt! – Calanus

0

Cuối cùng, tôi đã từ bỏ và đã có một loại phương pháp RunOnce để thực hiện công cụ này sau khi ứng dụng được cài đặt.

0

Câu trả lời ngắn gọn là nó không được hỗ trợ trong các lớp trình cài đặt. Bạn chỉ cần hiểu rằng các phương thức lớp trình cài đặt được gọi từ msiexec.exe đang chạy từ thư mục hệ thống, và môi trường đó không thể biết rằng bạn có tệp cài đặt ở đâu đó trong một thư mục mà nó hoàn toàn không biết. Đó là lý do tại sao nó hoạt động với mã rõ ràng đi đến vị trí được cài đặt của tập tin và cập nhật nó ở đó.

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