【问题标题】:C# Windows Service XMLC# Windows 服务 XML
【发布时间】:2011-02-08 17:15:39
【问题描述】:

场景

我有一个用 C# 编写的 Windows 服务,它基于解析 XML 文件执行一些处理,并使用该数据执行各种任务。 该服务还进行各种日志记录 - 使用 APP.Config 文件中的设置。

问题

当服务被编译、安装和运行时,XML 文件似乎消失了。我的印象是它只是被忽略或类似的东西。

到目前为止

我尝试使用两个 App.Config 文件,一个名为 App.Config 包含服务设置,另一个名为 MyService.exe.config 包含 XML 文件中使用的所有数据(想法是我可以从实际编译并出现在我的安装目录中的配置文件中解析 XML。

然而

当我这样做时,会出现一个配置文件(名称为 MyService.exe.config),但它包含 App.Config 文件的内容,而不是我要解析的 XML 数据。

我需要什么

我只想为我的设置提供一个配置文件,为我的数据提供一个 XML 文件。

问题

这可能吗? 我知道该应用程序可以正常工作,因为它最初是作为运行良好的控制台应用程序构建的。

其他

应用程序必须以这种方式设计(例如,我需要将数据存储为 XML,并将我的设置存储在配置文件中)。

想法

如果我能以某种方式将这两个文件的内容合并到一个配置文件中,那将是解决问题的一种方法。但是,我已经尝试过了,当然我得到了“类型初始化异常”,因为配置文件无法解释 XML 数据(可能是因为标签是自定义的并且不构成配置架构的任何部分 - 或类似的东西) .

想法

如果我有可能拥有一个 XML 文件和一个配置文件,请有人向我解释一下,这些文件在运行时将被实际编译并存储在我的安装目录中以供服务使用?

代码

自定义 XML/数据配置文件

   <?xml version="1.0" encoding="utf-8" ?> 
  <configuration> 
  <servers> 
<SV066930> 
  <add name="Name" value = "SV066930" /> 
  <processes> 
<SimonTest1> 
  <add name="ProcessName" value="notepad.exe" /> 
  <add name="CommandLine" value="C:\\WINDOWS\\system32\\notepad.exe    C:\\WINDOWS\\Profiles\\TA2TOF1\\Desktop\\SimonTest1.txt" /> 
          </SimonTest1> 
 </processes> 
  </SV066930> 
  </servers> 
 </configuration> 

APP.Config 设置文件

   <?xml version="1.0" encoding="utf-8" ?> 
  <configuration> 
   <configSections> 
     <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxx" /> 
   </configSections> 
  <connectionStrings> 
 <add name="DB" connectionString="Data Source=etc......" /> 
  </connectionStrings> 
  </configuration> 

非常感谢您的帮助。

【问题讨论】:

    标签: c# windows xml service config


    【解决方案1】:

    您还没有说明您的 XML 文件的构建操作是什么。您可以将其设为内容,在这种情况下,它应该被复制到输出目录,或者您可以将其设为嵌入式资源,在这种情况下,它将嵌入到您的程序集中。

    如果您在构建后不需要更改它,我会选择嵌入式资源方法 - 这意味着您无需担心其他文件。但是,它不太灵活,因为您不能在之后更改文件。对于此选项,您将使用 Assembly.GetManifestResourceStream 在执行时加载 XML 文件。

    如果您选择 Content 方法,请注意您的进程的当前目录可能不是包含您的程序集的目录 - 您可以使用

    string module = typeof(YourService).Assembly.GetModules()[0].FullyQualifiedName;
    string directory = Path.GetDirectoryName(module);
    

    找到目录,然后加载相对于该目录的文件。

    【讨论】:

    • 使用 Path.GetDirectoryName 代替 Path.GetDirectory。
    【解决方案2】:

    C# 项目中名为 App.config 的文件在构建时被重命名为 MyService.exe.config,因此您将不得不重命名第二个配置文件。

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2020-04-25
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多