关于c#:访问另一个项目的设置文件

Accessing another project's settings file

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


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


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

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

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

我确信还有其他方法。


我将重新发布@ Kildareflare链接的内容以供将来参考。仍然可以在VS2015中使用,但对于我自己,我认为我更喜欢上面的"选项B"。

访问另一个项目中的"设置"

Visual Studio 2005的一个新酷功能是新的属性编辑器。使用此属性编辑器,您可以轻松地为应用程序添加设置。但它的实施方式存在问题。让我解释一下你为什么。

通常,设置特定于项目。在项目中添加设置时,与设置文件关联的特殊自定义工具会生成一个可用于访问它的新类。这个课程有什么好处,它是强类型的。但在幕后,它只是从xml文件中获取一个键。生成的类设置为"内部密封"。这可以防止从任何其他程序集访问。如果要集中编辑这些设置的位置,该怎么办?

经过多次尝试揭露它后,我发现了一种快速简便的方法。假设我们的解决方案中有2个项目:Engine和WinApp。每个都有设置,但我们希望它们可以从WinApp编辑。这是它的样子。

Settings Before

如果您想在此处访问引擎设置,请参阅:添加链接文件。

Add Link

链接文件将作为WinApp项目的一部分进行编译。设置类仍然是内部和密封的,但是WinApp项目而不是引擎。

这是最终结果:

Settings After

请注意,我添加了一个与我的Engine项目同名的文件夹。如果要添加许多项目的设置,这将非常有用。

有了这个,您可以从WinApp类中访问引擎设置引擎类的方式。您可以省略引擎类中的"引擎"部分,因为您应该位于同一名称空间中。这是它应该是什么样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting ="test";
        }
    }
}


我不得不提出另外的解决方案,除了已经在这里给出的解决方案,因为我在包含设置的项目的App.config上使用XML Tranforms(通过SlowCheetah)。如果您不这样做,我建议使用其他解决方案之一。

我在使用项目中添加了一个构建后的步骤(示例中为Proj1),以从Proj2的输出文件夹中复制配置文件。这将确保配置将应用转换。 (在我的例子中,Proj1是一个DLL,所以如果你的是一个exe,将DestinationFiles从".dll.config"更改为".exe.config"。)来自Proj1.csproj的片段:

1
2
3
<Target Name="AfterBuild">
  <Copy SourceFiles="..\Proj2\bin\$(Configuration)\Proj2.exe.config" DestinationFiles="$(TargetDir)\$(AssemblyName).dll.config" />
</Target>

然后我通过ctrl + shift +将文件拖到Proj1(如Kildareflare引用的博客文章中),从Proj2创建了Settings.settings的链接。

然后,我可以在Proj1中引用类似于Proj2.Properties.Settings.Default.MySetting的设置。

注意:如果您正在进行单元测试,例如我(Proj1是测试DLL),并且您正在使用ReSharper测试运行器,请确保将其配置为在单独的AppDomain中运行测试。


由于Settings.Designer.csinternal类,并且您不想弄乱生成的代码文件,我建议将辅助节点添加为"朋友"项目。

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

将以下代码添加到Proj2AssemblyInfo.cs

1
2
3
using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("Proj1")]

我自己没有测试过这种方法,但Eric De Carufel的小技巧可能就是你所需要的:

http://blog.decarufel.net/2007/10/getting-access-to-settings-in-another.html

原始链接似乎已经死亡,因为他已移至新博客并删除了旧内容。

原始内容如下:

访问另一个项目中的"设置"

2007年10月25日星期四

Visual Studio 2005的一个新酷功能是新的属性编辑器。使用此属性编辑器,您可以轻松地为应用程序添加设置。但这是一个问题,就像它的实施方式一样。让我解释一下你为什么。

通常,设置特定于项目。在项目中添加设置时,与设置文件关联的特殊自定义工具会生成一个可用于访问它的新类。这个课程有什么好处,它是强类型的。但在幕后,它只是从xml文件中获取一个键。生成的类设置为"内部密封"。这可以防止从任何其他组件访问。如果要集中编辑这些设置的位置,该怎么办?

经过多次尝试揭露它后,我发现了一种快速简便的方法。假设我们的解决方案中有2个项目:Engine和WinApp。每个都有设置,但我们希望它们可以从WinApp编辑。这是它的样子。

如果您想在此处获取引擎设置的访问权限:添加链接文件。

链接文件将作为WinApp项目的一部分进行编译。设置类仍然是内部和密封的,但是WinApp项目而不是引擎。

这是最终结果:

请注意,我添加了一个与我的Engine项目同名的foler。如果要添加许多项目的设置,这将有所帮助。

有了这个,您可以从WinApp类中访问引擎设置引擎类的方式。您可以省略引擎类中的"引擎"部分,因为您应该位于同一名称空间中。这是它应该是什么样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace WinApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void AccessConfig()
        {
            Engine.Properties.Settings.Default.EngineSetting ="test";
        }
    }
}