在设置选项卡上,您可以选择访问修饰符。它可能是“Friend”或“Public”。据推测,当您选择“Public”时,您正在使设置可供其他程序集访问。但是,一旦选择了“Public”,我就无法找出从另一个项目引用一个项目的设置的语法。实际上,使用“Internal”与使用“Public”作为访问修饰符之间没有任何区别。
我的问题是:选择“Public”作为访问修饰符是否会使设置对其他程序集可用?如果是这样,从其他程序集引用设置的语法是什么?如果不是,那么“Public”是什么作用?
我认为你可以在应用程序启动时将设置对象的实例从一个DLL传递到另一个DLL中,然后使用此类的Item属性访问设置(Setting类是从ApplicationSettingsBase继承的类)
'在DLL1中: Class1 Shared Property SettingsFromAnotherDLL As ApplicationSettingsBase ...
'在DLL2中:(在启动时完成) Class1.SettingsFromAnotherDLL = My.Settings.Default
'在DLL2中访问设置时 Dim Setting As STring = Class1.SettingsFromAnotherDLL.Item("SettingKey")
以下是示例代码,用于获取位于我们执行应用程序附近的任何 .exe 的名为 DataBaseName
的设置值,并将其存储在“dbName”变量中:
string currentDirectory = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string exeName = System.IO.Path.GetFileName(Assembly.GetExecutingAssembly().Location);
FileInfo[] fileInfos = new DirectoryInfo(currentDirectory).GetFiles("*.exe");
foreach (FileInfo fi in fileInfos)
{
if (fi.FullName == System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) continue;
Assembly asm = Assembly.LoadFrom(fi.FullName);
Type[] allTypes = asm.GetTypes();
foreach (Type type in allTypes)
{
if (type.Name != "Settings") continue;
Type settingsType = type;
PropertyInfo propDefault = type.GetProperty("Default");
object defaultSettings = propDefault.GetValue(null, null);
PropertyInfo piDBName = settingsType.GetProperty("DataBaseName");
string dbName = (string)piDBName.GetValue(defaultSettings, null);
break;
}
break;
}
在VB.NET中,这比C#略微棘手一些。这主要是因为在VB.NET中,命名空间不是如此关键。因此,在VB.NET解决方案中,对于所有项目/子程序集具有相同根(默认)命名空间并不罕见 - 尽管这可能不是很好的做法,例如:
MyNamespace.Main, MyNamespace.ClassLib1, MyNamespace.ClassLib2, MyNamespace.Common, etc.
由于这个原因,在问题的其他位置描述的项目间设置访问方法会失败。
在VB.NET中访问引用项目中的设置的建议方式是:
Settings
访问修饰符设置为 Public
,{MyNamespace}.My.MySettings.Default.{MySetting}
访问设置(只读)。请注意,My.MySettings
是直接属于 MyNamespace
的属性,而不是程序集名称的属性。
只有当子程序集的命名空间与引用项目的命名空间不同时,您才能访问 MySetting
。如果命名空间相同,则根本不可见,我找不到任何访问它的方法。(我可以深入研究ILM,也许找出编译器为避免冲突所做的事情 - 这可能是否则的情况 - 但这是一个无关紧要的问题。)
我已经在C#.NET和VB.NET中进行了测试。尽可能区分您的根命名空间,你就会有喜悦。