有没有办法从不同的项目访问设置文件?例如,我有一个包含2个项目的解决方案(让我们称之为Proj1和Proj2)。我想从Proj1中的Program.cs访问Proj2的应用程序设置。这可能吗?
选项A:从其他程序集的配置文件中解析值(存储设置的位置)
选项B:在Proj2
中创建一个公共类,它将必要的值从其设置中公开为静态属性,然后引用Proj1
中的程序集并使用该类中的值。
选项C:如果要公开所有设置,可以修改internal
到public
的设置类的访问权限。
我确信还有其他方法。
如果您使用C#,答案是: 非常简单的答案是右键单击proj2,选择设置选项卡。在顶部,您会发现设置类的访问修饰符是:internal,将其更改为public。在proj1中添加对proj2的引用,以便查看proj2 Settings类。就这样。
我将重新发布@ Kildareflare链接的内容以供将来参考。仍然可以在VS2015中使用,但对于我自己,我认为我更喜欢上面的“选项B”。
访问另一个项目中的“设置”
Visual Studio 2005的一个新酷功能是新的属性编辑器。使用此属性编辑器,您可以轻松地为应用程序添加设置。但它的实施方式存在问题。让我解释一下你为什么。
通常,设置特定于项目。在项目中添加设置时,与设置文件关联的特殊自定义工具会生成一个可用于访问它的新类。这个课程有什么好处,它是强类型的。但在幕后,它只是从xml文件中获取一个键。生成的类设置为“内部密封”。这可以防止从任何其他程序集访问。如果要集中编辑这些设置的位置,该怎么办?
经过多次尝试揭露它后,我发现了一种快速简便的方法。假设我们的解决方案中有2个项目:Engine和WinApp。每个都有设置,但我们希望它们可以从WinApp编辑。这是它的样子。
如果您想在此处访问引擎设置,请参阅:添加链接文件。
链接文件将作为WinApp项目的一部分进行编译。设置类仍然是内部和密封的,但是WinApp项目而不是引擎。
这是最终结果:
请注意,我添加了一个与我的Engine项目同名的文件夹。如果要添加许多项目的设置,这将非常有用。
有了这个,您可以从WinApp类中访问引擎设置引擎类的方式。您可以省略引擎类中的“引擎”部分,因为您应该位于同一名称空间中。这是它应该是什么样子:
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的片段:
<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测试运行器,请务必使用configure it to run tests in separate AppDomains。
由于Settings.Designer.cs
是一个internal
类,并且你不想搞乱生成的代码文件,我建议将secondary添加为“朋友”项目。
来自:C# "internal" access modifier when doing unit testing
将以下代码添加到Proj2
的AssemblyInfo.cs
中
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项目同名的文件夹。如果要添加许多项目的设置,这将非常有用。
有了这个,您可以从WinApp类中访问引擎设置引擎类的方式。您可以省略引擎类中的“引擎”部分,因为您应该位于同一名称空间中。这是它应该是什么样子:
namespace WinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void AccessConfig()
{
Engine.Properties.Settings.Default.EngineSetting = "test";
}
}
}