有没有办法从不同的项目访问设置文件?例如,我有一个包含 2 个项目的解决方案(我们称它们为 Proj1 和 Proj2)。我想从 Proj1 中的 Program.cs 访问 Proj2 的应用程序设置。这可能吗?
8 回答
如果您使用 C#,答案是:
非常简单的答案是右键单击 proj2,选择设置选项卡。在顶部,您会发现设置类的访问修饰符是:internal,将其更改为 public。在 proj1 中添加对 proj2 的引用,以便查看 proj2 Settings 类。就这样。
选项 A:从其他程序集的配置文件(存储设置的位置)中解析值
选项 B:创建一个公共类Proj2
,将其设置中的必要值公开为静态属性,然后引用程序集Proj1
并使用该类中的值。
选项 C :如果要公开所有设置,可以将设置类的访问权限从 修改internal
为public
。
我相信还有其他方法。
我将重新发布@Kildareflare 链接的内容以供将来参考。仍然可以在 VS2015 中使用,但就我自己而言,我认为我更喜欢上面的“选项 B”。
访问另一个项目中的设置
Visual Studio 2005 的新特性之一是新的属性编辑器。使用此属性编辑器,您可以轻松地将设置添加到您的应用程序。但它的实现方式存在问题。让我解释一下为什么。
通常这些设置特定于项目。当您在项目中添加设置时,与设置文件关联的特殊自定义工具会生成一个新类,您可以使用它来访问它。这个类的好处是它是强类型的。但在幕后,它只是从 xml 文件中获取密钥。这个生成的类被设置为“内部密封”。这可以防止从任何其他程序集访问。如果您想集中编辑这些设置的位置怎么办。
在多次尝试揭露它之后,我找到了一种快速简单的方法来做到这一点。假设我们的解决方案中有 2 个项目:一个引擎和一个 WinApp。每个都有设置,但我们希望它们可以从 WinApp 编辑。这是它的样子。
如果您想在此处访问引擎设置,诀窍是:添加链接文件。
链接文件将作为 WinApp 项目的一部分进行编译。设置类仍然是内部的和密封的,但对于 WinApp 项目而不是引擎。
这是最终结果:
请注意,我添加了一个与我的引擎项目同名的文件夹。如果您想从许多项目中添加设置,这将很有帮助。
有了这个,您可以从引擎类访问引擎设置,就像从 WinApp 类一样。你可以从你的引擎类中省略“引擎”部分,因为你应该在同一个命名空间中。这是它的样子:
namespace WinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void AccessConfig()
{
Engine.Properties.Settings.Default.EngineSetting = "test";
}
}
}
ConfigurationManager 涵盖了:
string proj2Exe = @"C:\projects\proj2\bin\Debug\proj2.exe";
Configuration proj2Config = ConfigurationManager.OpenExeConfiguration(proj2Exe);
string mysetting = proj2Config .AppSettings.Settings["ThatSetting"].Value;
除了这里已经给出的解决方案之外,我还必须想出另一个解决方案,因为我在包含设置的项目的 App.config 上使用 XML Tranforms(通过 SlowCheetah)。如果您不这样做,我推荐其他解决方案之一。
我在使用项目(示例中的 Proj1)中添加了一个构建后步骤,以从 Proj2 的输出文件夹中复制配置文件。这将确保配置将应用转换。(在我的例子中,Proj1 是一个 dll,所以如果你的是一个 exe,请将 DestinationFiles 从“.dll.config”更改为“.exe.config”。)来自 Proj1.csproj 的片段:
<Target Name="AfterBuild">
<Copy SourceFiles="..\Proj2\bin\$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)\$(AssemblyName).dll.config" />
</Target>
然后,我通过 ctrl+shift+将文件拖动到 Proj1,从 Proj2 创建了 Settings.settings 的链接(如 引用的博客文章中所示Kildareflare
)。
然后我可以参考 Proj1 中的设置,类似于:Proj2.Properties.Settings.Default.MySetting
.
注意:如果您像我一样为单元测试执行此操作(Proj1 是一个测试 DLL),并且您使用的是 ReSharper 测试运行器,请务必将其配置为在单独的 AppDomains 中运行测试。
今天面对这个麻烦,伙计。configSections
通过在第一个项目的 app.config 文件之间添加第二个项目的设置部分来解决
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx">
<section name="fullSecondProjectName" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
然后不要忘记添加这些用户设置
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx">
<section name="fullSecondProjectName" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxx" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
...
<userSettings>
<fullSecondProjectName>
<setting name="LogMethodInvocation" serializeAs="String">
<value>True</value>
</setting>
</fullSecondProjectName>
</userSettings>
</configuration>
我自己没有测试过这种方法,但 Eric De Carufel 的小技巧可能是你需要的:
http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html
由于他已移至新博客并删除了旧内容,因此原始链接似乎已失效。
原文内容如下:
访问另一个项目中的设置
2007 年 10 月 25 日,星期四
Visual Studio 2005 的新特性之一是新的属性编辑器。使用此属性编辑器,您可以轻松地将设置添加到您的应用程序。但是它的实施方式存在问题。让我解释一下为什么。
通常这些设置特定于项目。当您在项目中添加设置时,与设置文件关联的特殊自定义工具会生成一个新类,您可以使用它来访问它。这个类的好处是它是强类型的。但在幕后,它只是从 xml 文件中获取密钥。这个生成的类被设置为“内部密封”。这可以防止从任何其他组件访问蜜蜂。如果您想集中编辑这些设置的位置怎么办。
在多次尝试揭露它之后,我找到了一种快速简单的方法来做到这一点。假设我们的解决方案中有 2 个项目:一个引擎和一个 WinApp。每个都有设置,但我们希望它们可以从 WinApp 编辑。这是它的样子。
如果您想在此处访问引擎设置,请使用以下技巧:添加链接文件。
链接文件将作为 WinApp 项目的一部分进行编译。设置类仍然是内部的和密封的,但对于 WinApp 项目而不是引擎。
这是最终结果:
请注意,我添加了一个与我的引擎项目同名的文件夹。如果您想从许多项目中添加设置,这将很有帮助。
有了这个,您可以从引擎类访问引擎设置,就像从 WinApp 类一样。你可以从你的引擎类中省略“引擎”部分,因为你应该在同一个命名空间中。这是它的样子:
namespace WinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void AccessConfig()
{
Engine.Properties.Settings.Default.EngineSetting = "test";
}
}
}
由于Settings.Designer.cs
是一个internal
类,并且您不想弄乱生成的代码文件,我建议将辅助添加为“朋友”项目。
Proj2
将以下代码添加到AssemblyInfo.cs
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Proj1")]