从另一个可访问的C#应用​​程序中读取用户(而非app)设置

时间:2015-11-02 12:52:20

标签: c# .net linqpad

假设我有两个应用程序A和B.应用程序A具有标准Settings.settings类型的配置。我已经设置了A的设置public(而不是默认internal)。在B中引用A并转到A.Settings.Default仅产生设计时默认值。没有保存的用户设置。调用Reload无效。

更简单的是,在LINQPad中导入对A的引用并转储A.Settings.Default仅显示默认值。与上面的结果非常相似。

我在SO上发现了几个类似的问题,但没有一个有明确的答案。是否有一种简单的方法可以做一些看似微不足道的任务?

1 个答案:

答案 0 :(得分:1)

我们假设您的应用是A.exe和B.exe。

B.exe引用A.exe。

当我运行A.exe时,它会读取/写入用户设置:

C:\Users\<user>\AppData\Local\A\A.exe_Url_ify12bcwso2vevlc4wawlllokphlsntr\1.0.0.0\user.config

当我运行B.exe时,它会读取/写入(来自A.exe)的用户设置:

C:\Users\<user>\AppData\Local\B\B.exe_Url_vhnd4ku3yt2pxsldv3qsblquadzyhg3g\1.0.0.0\user.config

我通过使用procmon.exe

监视A和B exes的磁盘活动来获取这些路径

如您所见,用户设置背后的逻辑实际上与应用设置相同。运行时使用当前正在执行的进程名称来存储用户设置,因此无法从A.exe中访问A.exe的设置,因为它们是从A.exe中保存的。

以下是我测试的代码:

A.exe时:

static void Main(string[] args)
{
    Console.WriteLine("A.Settings1.Default.AExeSetting1: {0}", A.Settings1.Default.AExeSetting1);
    A.Settings1.Default.AExeSetting1 += "-";
    Console.ReadLine();
    A.Settings1.Default.Save();
}

B.EXE:

static void Main(string[] args)
{
    Console.WriteLine("A.Settings1.Default.AExeSetting1: {0}", A.Settings1.Default.AExeSetting1);
    A.Settings1.Default.AExeSetting1 += "-";
    Console.ReadLine();
    A.Settings1.Default.Save();
}