【问题标题】:Visual Studio user Properties.Settings.Default file from multiple projects?来自多个项目的 Visual Studio 用户 Properties.Settings.Default 文件?
【发布时间】:2018-04-04 18:24:36
【问题描述】:

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

设置完成后,可以直接访问设置如下:

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 项目中访问它们。我可以创建一个类来基本上导出设置,但这似乎只有在启动可执行文件始终相同时才有效。当我运行单元测试(使用 xunit 2.0)时,我发现未设置设置 - 如果我使用库设置并保存它们,它们会显示在 AppData 的 Microsoft 文件夹中,这似乎与 Visual Studio 对应.

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

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


编辑 - 更新:

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

  1. Assembly Information 中的公司名称(Properties/AssemblyInfo.cs 或 Project Properties/Application/Assembly Information/Company)

    • 如果 Company 为空,它似乎使用来自 (/Application/Default 命名空间) 的 Default 命名空间,它与 Properties/Settings.settings/Settings.Designer.cs 中使用的命名空间相匹配
  2. 可执行文件名(即 app.exe)

    • 这严格来说是运行时的可执行文件名,包括扩展名,因此如果重命名文件,将会更改 AppData 中的设置文件名和位置
  3. 汇编版本

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

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

这意味着在运行单元测试时,它将始终查找并保存到与主可执行文件不同的设置文件中 - 因此,当您从任何程序集中访问 Properties.Settings.Default 参数时,它将在不同的文件中查找文件运行单元测试时的位置(并将其保存到不同的位置)而不是运行主可执行文件。

【问题讨论】:

    标签: c# visual-studio unit-testing configuration configuration-files


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 我会试试这个并报告。 :)
    • 这确实有效,所以我不需要将设置封装在一个类中来导出它们。即我可以直接从“朋友”程序集中访问它们,但它不能解决将程序集存储在不同文件中的问题。我会更新问题。
    • 所以,这确实回答了我原来的问题,但看起来我不能使用这种 VS 配置管理方法来访问主可执行文件和我的单元测试的设置(嗯 - 集成测试...... :) )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多