有没有办法从其他项目访问设置文件?例如,我有一个包含2个项目的解决方案(让我们称之为Proj1和Proj2)。我想从Proj1中的Program.cs访问Proj2的应用程序设置。这可能吗?
答案 0 :(得分:49)
如果您使用的是C#答案:
非常简单的答案是右键单击proj2,选择设置选项卡。在顶部,您会发现设置类的访问修饰符是:internal,将其更改为public。在proj1中添加对proj2的引用,以便查看proj2 Settings类。就是这样。
答案 1 :(得分:32)
选项A:从其他程序集的配置文件(存储设置的位置)中解析值
选项B:在Proj2
中创建一个公共类,它将必要的值从其设置中公开为静态属性,然后引用Proj1
中的程序集并使用该类中的值。
选项C:如果您要公开所有设置,可以修改设置类从internal
到public
的访问权限。
我确信还有其他方法。
答案 2 :(得分:4)
我将重新发布@ 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";
}
}
}
答案 3 :(得分: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(如Kildareflare
引用的博客文章中),从Proj2创建了一个Settings.settings的链接。
然后,我可以在Proj1中引用类似于Proj2.Properties.Settings.Default.MySetting
的设置。
注意:如果您正在进行像我这样的单元测试(Proj1是测试DLL),并且您正在使用ReSharper测试运行器,请务必configure it to run tests in separate AppDomains。
答案 4 :(得分:0)
ConfigurationManager具有以下内容:
string proj2Exe = @"C:\projects\proj2\bin\Debug\proj2.exe";
Configuration proj2Config = ConfigurationManager.OpenExeConfiguration(proj2Exe);
string mysetting = proj2Config .AppSettings.Settings["ThatSetting"].Value;
答案 5 :(得分:0)
今天遇到了这个麻烦,伙计。通过在第一个项目的 app.config 文件的 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>
然后不要忘记添加这些用户设置
<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>
答案 6 :(得分:-1)
我没有测试这种方法自己,但埃里克·德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类中访问引擎设置引擎类的方式。您可以省略引擎类中的“引擎”部分,因为您应该位于同一名称空间中。这是它应该是什么样子:
namespace WinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void AccessConfig()
{
Engine.Properties.Settings.Default.EngineSetting = "test";
}
}
}
答案 7 :(得分:-1)
由于Settings.Designer.cs
是internal
课程,并且您不想弄乱生成的代码文件,我建议您将辅助内容添加为&#34;朋友&#34 ;项目
来自:C# "internal" access modifier when doing unit testing
将以下代码添加到Proj2
&#39; AssemblyInfo.cs
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("Proj1")]