Làm cách nào để giữ các cài đặt user.config trên các phiên bản lắp ráp khác nhau trong .net?


146

Về cơ bản vấn đề là mỗi lần phiên bản lắp ráp thay đổi (tức là người dùng cài đặt phiên bản mới của ứng dụng), tất cả các cài đặt của chúng được đặt lại mặc định (hay chính xác hơn là tệp user.config mới được tạo trong một thư mục có phiên bản khác số như tên)

Làm cách nào tôi có thể giữ các cài đặt tương tự khi nâng cấp phiên bản, vì sử dụng tệp ini hoặc sổ đăng ký dường như không được khuyến khích?

Khi chúng tôi sử dụng Clickonce dường như có thể xử lý việc này, vì vậy có vẻ như nó sẽ có thể được thực hiện, nhưng tôi không biết làm thế nào.



Không, điều đó đề cập đến mặc định là không kiểm tra tệp vào kiểm soát phiên bản (hoặc do đó tôi đã thu thập) Điều này liên quan đến cài đặt cụ thể của người dùng (Windows) cho người dùng cuối
Davy8

Chỉ là câu hỏi tôi cần, cảm ơn :)
Binary Worrier

Tôi đã đăng một giải pháp khả thi trong chuỗi sau: stackoverflow.com/a/47921377/3223783 Hy vọng điều đó có ích!
dontbyteme

Tôi đã đăng một giải pháp có thể trong chủ đề này . Mong rằng sẽ giúp!
dontbyteme

Câu trả lời:


236

ApplicationSinstallBase có một phương thức gọi là Nâng cấp di chuyển tất cả các cài đặt từ phiên bản trước.

Để chạy hợp nhất bất cứ khi nào bạn xuất bản phiên bản mới của ứng dụng, bạn có thể xác định cờ boolean trong tệp cài đặt mặc định là true. Đặt tên là Nâng cấp Yêu cầu hoặc một cái gì đó tương tự.

Sau đó, khi bắt đầu ứng dụng, bạn kiểm tra xem cờ có được đặt không và nếu có, hãy gọi phương thức Nâng cấp , đặt cờ thành false và lưu cấu hình của bạn.

if (Settings.Default.UpgradeRequired)
{
    Settings.Default.Upgrade();
    Settings.Default.UpgradeRequired = false;
    Settings.Default.Save();
}

Đọc thêm về phương pháp Nâng cấp tại MSDN . Các GetPreviousVersion cũng có thể là đáng xem nếu bạn cần phải làm một số kết hợp tùy chỉnh.


2
Một câu hỏi nhỏ, những gì tạo thành một phiên bản mới? Bất kỳ phần nào của số 4 phần? Tôi sử dụng ClickOnce vì vậy đó có phải là một động vật khác không?
Khúc xạ Paladin

4
Loại cài đặt nào nên Nâng cấp đầy đủ? appSettings, userSettingshay applicationSettings? Là cài đặt Người dùng trên Cài đặt. Cài đặt, lần đầu tiên, nó được đổi thành sai, nó sẽ không bao giờ đúng nữa. Một phiên bản mới sẽ không thiết lập lại mà Nâng cấp đã trở lại thành True.
dialex

4
@dialex Nó phải là cài đặt Người dùng. Cài đặt loại Ứng dụng chỉ đọc. Số phiên bản mới khiến cài đặt phải đặt lại vì cài đặt được lưu trữ trong đường dẫn dành riêng cho phiên bản.
Leonard Thiệu

4
Tôi nghĩ rằng tôi đã trả lời câu hỏi của riêng tôi. Nếu có phiên bản trước của tệp cài đặt, nó sẽ sao chép giá trị của nó vào phiên bản mới nhất mỗi khi ứng dụng khởi động, có thể không phải là thứ bạn muốn!
Hugh Jeffner

1
Tôi hơi ngạc nhiên khi đây không chỉ là hành vi mặc định; nếu cài đặt của ứng dụng là null khi bắt đầu và nó tìm thấy một loạt các cài đặt trước đó, nó sẽ tải chúng.
SteveCinq

3

Tôi biết rằng đã được một lúc ... Trong một ứng dụng winforms, chỉ cần gọi My.Settings.Upgrade()trước khi bạn tải chúng. Điều này sẽ nhận được các cài đặt mới nhất, cho dù là phiên bản hiện tại hay phiên bản trước.


2

Đây là nghiên cứu của tôi trong trường hợp bất kỳ ai khác gặp khó khăn với các cài đặt di chuyển đã bị thay đổi / xóa. Vấn đề cơ bản là GetPreviousVersion()nó không hoạt động nếu bạn đã đổi tên hoặc xóa cài đặt trong phiên bản mới của ứng dụng. Vì vậy, bạn cần giữ cài đặt trong Settingslớp của mình , nhưng thêm một vài thuộc tính / tạo tác vào nó để bạn không vô tình sử dụng nó trong mã ở nơi khác, khiến nó trở nên lỗi thời. Một cài đặt lỗi thời mẫu sẽ trông như thế này trong VB.NET (có thể dễ dàng dịch sang C #):

<UserScopedSetting(),
DebuggerNonUserCode(),
DefaultSettingValue(""),
Obsolete("Do not use this property for any purpose. Use YOUR_NEW_SETTING_NAME instead."),
NoSettingsVersionUpgrade()>
Public Property OldSettingName() As String
  Get
    Throw New NotSupportedException("This property is obsolete")
  End Get
  Set
    Throw New NotSupportedException("This property is obsolete")
  End Set
End Property

Đảm bảo bạn thêm thuộc tính này vào cùng một không gian tên / lớp có cài đặt ứng dụng của bạn. Trong VB.NET, lớp này được đặt tên MySettingsvà có sẵn trong Mykhông gian tên. Bạn có thể sử dụng chức năng lớp một phần để ngăn các cài đặt lỗi thời trộn lẫn với các cài đặt hiện tại của bạn.

Tín dụng đầy đủ cho jsharrison để đăng một bài viết tuyệt vời về vấn đề này. Bạn có thể đọc thêm chi tiết về nó ở đó.


1

Đây là một biến thể của các giải pháp được trình bày ở đây, gói gọn logic nâng cấp thành một lớp trừu tượng mà các lớp cài đặt có thể rút ra.

Một số giải pháp được đề xuất sử dụng thuộc tính DefaultSinstallValue để chỉ định giá trị cho biết khi nào cài đặt trước đó không được tải. Sở thích của tôi là chỉ cần sử dụng một loại có giá trị mặc định cho biết điều này. Là một phần thưởng, một DateTime? là thông tin gỡ lỗi hữu ích.

public abstract class UserSettingsBase : ApplicationSettingsBase
{
    public UserSettingsBase() : base()
    {
        // Accessing a property attempts to load the settings for this assembly version
        // If LastSaved has no value (default) an upgrade might be needed
        if (LastSaved == null)
        {
            Upgrade();
        }
    }

    [UserScopedSetting]
    public DateTime? LastSaved
    {
        get { return (DateTime?)this[nameof(LastSaved)]; }
        private set { this[nameof(LastSaved)] = value; }
    }

    public override void Save()
    {
        LastSaved = DateTime.Now;
        base.Save();
    }
}

Xuất phát từ UserSinstallBase:

public class MySettings : UserSettingsBase
{
    [UserScopedSetting]
    public string SomeSetting
    {
        get { return (string)this[nameof(SomeSetting)]; }
        set { this[nameof(SomeSetting)] = value; }
    }

    public MySettings() : base() { }
}

Và sử dụng nó:

// Existing settings are loaded and upgraded if needed
MySettings settings = new MySettings();
...
settings.SomeSetting = "SomeValue";
...
settings.Save();

0

Nếu các thay đổi của bạn đối với user.sinstall được thực hiện theo chương trình, làm thế nào về việc duy trì một bản sao (chỉ) các sửa đổi cho user.sinstall trong một tệp riêng, ví dụ user.customized.sinstall?

Bạn có thể vẫn muốn duy trì và tải các cài đặt đã sửa đổi trong user.s settings. Nhưng theo cách này khi bạn cài đặt phiên bản mới hơn cho ứng dụng của mình với phiên bản người dùng mới hơn, bạn có thể hỏi người dùng nếu họ muốn tiếp tục sử dụng các cài đặt đã sửa đổi của họ bằng cách sao chép chúng vào cài đặt người dùng mới. Bạn có thể nhập chúng bán buôn hoặc nhận fancier và yêu cầu người dùng xác nhận cài đặt nào họ muốn tiếp tục sử dụng.

EDIT: Tôi đã đọc quá nhanh phần "chính xác hơn" về các phiên bản lắp ráp khiến người dùng mới cài đặt được cài đặt vào một thư mục dành riêng cho phiên bản mới. Do đó, ý tưởng trên có thể không giúp ích gì cho bạn, nhưng có thể cung cấp một số thực phẩm để suy nghĩ.


0

Đây là cách tôi xử lý nó:

public virtual void LoadSettings(ServiceFileFormBaseSettings settings = null, bool resetSettingsToDefaults = false)
{
    if (settings == null)
            return;

    if (resetSettingsToDefaults)
        settings.Reset();
    else
    {
        settings.Reload();

        if (settings.IsDefault)
            settings.Upgrade();
    }

    this.Size = settings.FormSize;

}

và trong lớp cài đặt, tôi đã định nghĩa thuộc tính IsDefault:

// SaveSettings always sets this to be FALSE.
// This will have the default value TRUE when first deployed, or immediately after an upgrade.
// When the settings exist, this is false.
//
[UserScopedSettingAttribute()]
[DefaultSettingValueAttribute("true")]
public virtual bool IsDefault
{
    get { return (bool)this["IsDefault"]; }
    set { this["IsDefault"] = value; }
}

Trong SaveS Settings, tôi đặt IsDefault thành false:

public virtual void SaveSettings(ServiceFileFormBaseSettings settings = null)
{
    if (settings == null) // ignore calls from this base form, if any
        return;

    settings.IsDefault = false;
    settings.FormSize = this.Size;
    settings.Save();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.