繁体   English   中英

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

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

因此,尽管在最新的 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. 装配信息中的公司名称(Properties/AssemblyInfo.cs 或 Project Properties/Application/Assembly Information/Company)

    • 如果 Company 为空,则它似乎使用来自 (/Application/Default namespace) 的 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 参数时,它会在不同的位置(和将它保存到不同的地方)在运行单元测试而不是运行主可执行文件时。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM