Visual Studio 用户 Properties.Settings.Default 来自多个项目的文件?

Visual Studio user Properties.Settings.Default file from multiple projects?

所以,尽管在最新的 Visual Studio 设置文件中有很多信息很难理解和查找,但我还是弄明白了。在您的 executable 项目上,右键单击 select properties,然后左键单击左侧的 settings 选项卡,创建一个设置文件(如果需要),并在 table 中填写一些设置名称、类型和值。如果您希望这些是嵌入在 executable 中且只读的永久默认值,请将范围设置为 "application",但如果您将其保留在 "user" 的默认范围内,然后您可以将新值保存到系统 AppData 文件夹中的特殊 user.config 文件中,每次启动您的应用程序时都会从中读取该文件,覆盖嵌入式默认值。这基本上允许每个用户都有一个由系统自动存储的配置文件,保存一些配置设置,例如最后 window 位置等

这样设置后,可以直接进入设置如下:

var variable1 = Properties.Settings.Default.Variable1;
var variable2 = Properties.Settings.Default.Variable2;

等等。将属性设置为新值同样简单:

Properties.Settings.Default.Variable1 = variable1;
Properties.Settings.Default.Variable2 = variable2;

然后,如果您想将具有当前值的特殊用户文件保存到 C:\users\username\AppData\Local\ApplicationName.exe.xxxx\user.config 之类的文件中,则只需使用:

Properties.Settings.Default.Save();

问题出在这里 - 我想从我的解决方案中的所有文件访问这些相同的设置,但自动生成的方法被标记为内部方法,因此只能从我的主 exe 项目访问它们。我可以创建一个 class 来导出设置,但这似乎只有在启动 executable 始终相同时才有效。当我 运行 单元测试(使用 xunit 2.0)时,我发现设置未设置 - 如果我使用库设置它们并保存,它们会显示在 AppData 的 Microsoft 文件夹中,即似乎对应于 Visual Studio.

有谁知道我可以在整个解决方案中可靠地访问项目的 Properties.Settings.Default 值的方法,或者我是否坚持使用已知位置的直接文件和所有 I/O并解析需要?

如果是这样,在内置 Visual Studio 设置系统之外是否有用于此任务的标准 C# 配置文件库?


编辑 - 更新:

设置文件似乎基于以下内容:

  1. 程序集信息中的公司名称(Properties/AssemblyInfo.cs 或项目Properties/Application/AssemblyInformation/Company)

    • 如果公司为空,它似乎使用来自(/Application/Default 命名空间的默认命名空间,这与 Properties/Settings.settings/Settings.[=80= 中使用的命名空间相匹配]
  2. Executable 名称(即 app.exe)

    • 这完全是 运行 时的 executable 名称,包括扩展名,因此如果您重命名该文件,将更改 AppData
    • 中的设置文件名称和位置
  3. 汇编版本

AppData/Local 中的文件夹将是上面的 #1,然后嵌套文件夹将具有 executable 名称(上面的#2)并附加一些其他字符,然后是最终的嵌套文件夹将是版本(上面的#3),其中的文件将是 user.config.

所以,似乎发生的事情是,当单元测试 运行ner 执行时,运行ner 的公司用于 #1(内置 VS 运行ners 将使用 "Microsoft",Resharper 运行ner 将使用 "JetBrains",等等),exe 名称仍将以测试的命名空间开头,然后是版本number也来自测试运行ner(我认为)。

这意味着当 运行 进行单元测试时,它将始终查找并保存到与主执行程序不同的设置文件 table - 所以当您访问 Properties.Settings.Default 参数时任何程序集,当 运行ning 单元测试而不是 运行ning 主执行 table.[= 时,它将在不同的位置查找文件(并将其保存到不同的位置) 21=]

您始终可以通过将以下内容添加到主 exe 项目中的 AssemblyInfo.cs [assembly: InternalsVisibleTo("UnitTestProject1")] 来公开标记为内部的对象。然后您应该可以访问测试项目的内部对象。

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v=vs.110).aspx