You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

UWP C#桌面应用:无需重装即可修改API端点的配置文件问询

在UWP C#应用中实现可编辑的配置文件(无需重装)

嘿,我之前做UWP项目时刚好碰到过一模一样的需求,给你几个实用的方案,不用重装就能修改API端点:

最推荐的方案:使用可写目录下的配置文件

UWP应用的安装目录是只读的,所以直接放配置文件在安装目录里没法修改。我们可以这么做:

  • 第一步:在项目里添加一个配置文件(比如appsettings.json或者config.xml),右键文件属性,设置生成操作Content复制到输出目录如果较新则复制。这样打包后这个文件会跟着应用一起安装到只读目录里。
  • 第二步:应用第一次启动时,把这个配置文件复制到应用的LocalFolder(这是应用专属的可写目录),之后所有读取配置的操作都从这个可写目录里取。
  • 第三步:用户要修改API端点时,找到LocalFolder里的配置文件编辑就行,重启应用就生效,完全不用重装。

代码示例

复制配置文件到可写目录

private async Task InitializeConfig()
{
    var localFolder = ApplicationData.Current.LocalFolder;
    var existingConfig = await localFolder.TryGetItemAsync("appsettings.json");
    
    // 如果LocalFolder里还没有配置文件,就从安装目录复制过来
    if (existingConfig == null)
    {
        var installedFolder = Package.Current.InstalledLocation;
        var sourceConfig = await installedFolder.GetFileAsync("appsettings.json");
        await sourceConfig.CopyAsync(localFolder);
    }
}

读取API端点配置

// 先定义一个对应配置的模型类
public class AppConfig
{
    public string ApiEndpoint { get; set; }
}

private async Task<string> GetApiEndpoint()
{
    var localFolder = ApplicationData.Current.LocalFolder;
    var configFile = await localFolder.GetFileAsync("appsettings.json");
    var jsonContent = await FileIO.ReadTextAsync(configFile);
    
    // 用System.Text.Json反序列化(也可以用Newtonsoft.Json)
    var config = JsonSerializer.Deserialize<AppConfig>(jsonContent);
    return config?.ApiEndpoint ?? "默认的API地址";
}

怎么找到LocalFolder的路径?

用户可以通过以下方式找到配置文件:

  • 你可以在应用里加个调试按钮,把localFolder.Path输出给用户看
  • 手动导航:C:\Users\<你的用户名>\AppData\Local\Packages\<应用包家族名>\LocalState,包家族名可以在Package.appxmanifest里找到,或者代码里用Package.Current.Id.FamilyName获取

额外优化:给用户做个配置界面

如果不想让用户手动找文件,你可以在应用里加个简单的设置页面,让用户输入API端点,然后把修改后的内容写回LocalFolder的配置文件里,这样更友好。示例代码:

private async Task SaveApiEndpoint(string newEndpoint)
{
    var config = new AppConfig { ApiEndpoint = newEndpoint };
    var jsonContent = JsonSerializer.Serialize(config);
    
    var localFolder = ApplicationData.Current.LocalFolder;
    var configFile = await localFolder.CreateFileAsync("appsettings.json", CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteTextAsync(configFile, jsonContent);
}

其他备选方案

  • 注册表:UWP应用可以访问自己专属的注册表项(HKCU\Software\Classes\Local Settings\Software\<你的应用包名>),用户可以通过注册表编辑器修改,但不如配置文件直观。
  • 桌面桥应用:如果你的UWP是打包Win32程序的桌面桥应用,其实可以沿用传统的App.config,但同样要注意把它复制到可写目录,不然安装目录里的还是只读的。

内容的提问来源于stack exchange,提问作者Mocha

火山引擎 最新活动