Pre*_*zel 10 .net c# dll application-settings
我最近在C#(.Net 2.0)中编写了一个DLL,其中包含一个需要IP地址的类.我的同事改变了类以从".dll.config"(XML)文件中检索IP - 这显然是由他创建的"应用程序设置"文件(Settings1.settings)自动生成的.这样做的好处是允许最终用户随意更改XML/config文件中的IP地址.
不幸的是,当我从树中检查他的代码并尝试编译(或使用)这个新代码时,任何调用此DLL的应用程序只获取默认值,而不是文件中的值.
调用配置文件的构造函数如下所示:
public class form : System.Windows.Forms.Form
{
public form()
{
// This call is required by the Windows Form Designer.
InitializeComponent();
IP = IPAddress.Parse(Settings1.Default.IPAddress);
}
}
Run Code Online (Sandbox Code Playgroud)
"旧"值(您在开发时定义的值)是硬编码的.如果franework无法访问或打开配置文件,它将使用默认值.如果您在dll中使用设置,这将始终发生.
这是否意味着我无法在配置文件中存储DLL的外部值?(我的同事以某种方式完成了这项工作......)
由于我的框架似乎无法访问或打开配置文件,我该如何找出它失败的原因?甚至可以检测到何时发生?
德克尔:这有点帮助.不幸的是,我正在将此DLL写入规范,因此我实际上无法访问应用程序的配置文件.如上所述,我的同事创建了"Settings 1 .settings"文件.我当时并不理解这一点,但现在似乎添加"1"会使其超出任何调用它的应用程序的设置空间.
我想我想弄清楚的是为什么DLL似乎没有找到位于同一目录旁边的配置文件.通过代码逐步跟踪不会显示任何内容.
顺便说一句,我可以将程序集的"输出类型"从"类库"更改为"Windows应用程序",并在我的DLL代码的开头添加以下行:
[STAThread]
public static void Main(string[] args)
{
System.Windows.Forms.Application.Run(new form());
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它会生成一个不同的配置文件(".exe.config"),我可以改变它并从文件中提取新数据.所以我有点困惑.有任何想法吗?
我一直都在使用这种技术.通常我有一个需要某些设置的库程序集,我需要通过测试项目以及主要的"可执行"程序集来设置它们 - 无论是Web项目还是Windows服务项目.
你是正确的,当你为任何项目创建一个设置文件时,它会添加一个应用程序配置文件.您为任何设置输入的值存储在两个位置 - 配置文件和设置基础结构创建的类的属性.找不到配置文件时,将使用属性中嵌入的值.
这是一个显示这样一个属性的代码段:
这是一个片段,显示生成的类中ConcordanceServicesEndpointName的默认值:
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("InternalTCP")]
public string ConcordanceServicesEndpointName {
get {
return ((string)(this["ConcordanceServicesEndpointName"]));
}
}
Run Code Online (Sandbox Code Playgroud)
您要做的是从库程序集项目中复制app.config文件中的配置部分,并将其(小心地)合并到适用于主程序集的web.config或app.config中.在运行时,这是唯一使用的配置文件.
这是一个例子:
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="LitigationPortal.Documents.BLL.DocumentsBLLSettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<LitigationPortal.Documents.BLL.DocumentsBLLSettings>
<setting name="ConcordanceServicesEndpointName" serializeAs="String">
<value>InternalTCP</value>
</setting>
</KayeScholer.LitigationPortal.Documents.BLL.DocumentsBLLSettings>
</applicationSettings>
Run Code Online (Sandbox Code Playgroud)
您应该将这些部分复制到"true"配置文件中.
我正在一个正在进行原型设计的应用程序中解决这个确切的问题。尽管 Decker 关于将配置文件一起破解的建议应该可行,但我认为这是一个非常不方便的手动破解,作为构建周期的一部分执行。相反,我决定最干净的解决方案是让每个库解析自己的library.dll.config 文件。它仍然不完美,并且需要一些额外的样板代码,但这似乎是绕过 .Net 处理这些 app.config 文件的复杂方式的唯一方法。
归档时间: |
|
查看次数: |
11986 次 |
最近记录: |