47

有没有办法从不同的项目访问设置文件?例如,我有一个包含 2 个项目的解决方案(我们称它们为 Proj1 和 Proj2)。我想从 Proj1 中的 Program.cs 访问 Proj2 的应用程序设置。这可能吗?

4

8 回答 8

57

如果您使用 C#,答案是:
非常简单的答案是右键单击 proj2,选择设置选项卡。在顶部,您会发现设置类的访问修饰符是:internal,将其更改为 public。在 proj1 中添加对 proj2 的引用,以便查看 proj2 Settings 类。就这样。

于 2011-03-13T09:31:18.087 回答
39

选项 A:从其他程序集的配置文件(存储设置的位置)中解析值

选项 B:创建一个公共类Proj2,将其设置中的必要值公开为静态属性,然后引用程序集Proj1并使用该类中的值。

选项 C :如果要公开所有设置,可以将设置类的访问权限从 修改internalpublic

我相信还有其他方法。

于 2010-03-31T02:42:03.750 回答
4

我将重新发布@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";
        }
    }
}
于 2015-12-09T18:50:27.157 回答
1

ConfigurationManager 涵盖了:

string proj2Exe = @"C:\projects\proj2\bin\Debug\proj2.exe";
Configuration proj2Config = ConfigurationManager.OpenExeConfiguration(proj2Exe);
string mysetting = proj2Config .AppSettings.Settings["ThatSetting"].Value;
于 2019-12-19T15:10:14.170 回答
0

除了这里已经给出的解决方案之外,我还必须想出另一个解决方案,因为我在包含设置的项目的 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 中运行测试

于 2014-04-09T19:08:46.717 回答
0

今天面对这个麻烦,伙计。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>
于 2021-04-09T06:12:47.050 回答
-1

我自己没有测试过这种方法,但 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";
        }
    }
}
于 2011-05-11T15:37:21.440 回答
-1

由于Settings.Designer.cs是一个internal类,并且您不想弄乱生成的代码文件,我建议将辅助添加为“朋友”项目。

来自:进行单元测试时的 C#“内部”访问修饰符

Proj2将以下代码添加到AssemblyInfo.cs

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("Proj1")]
于 2017-10-31T09:30:09.050 回答