C # Windows Service XML - PullRequest
       8

C # Windows Service XML

6 голосов
/ 16 апреля 2010

Сценарий

У меня есть служба Windows, написанная на C #, которая выполняет некоторую обработку, основанную на анализе файла 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> 

Помощь с благодарностью.

Ответы [ 2 ]

7 голосов
/ 16 апреля 2010

Вы еще не сказали, что такое действие сборки для вашего XML-файла. Вы можете сделать его Content, в этом случае его следует скопировать в выходной каталог, или вы можете сделать его встроенным ресурсом, и в этом случае он будет встроен в вашу сборку.

Если вам не нужно менять его после сборки, я бы остановился на подходе Embedded Resource - это означает, что вам не о чем беспокоиться. Тем не менее, он менее гибок, так как вы не можете изменить файл впоследствии. Для этого параметра вы должны использовать Assembly.GetManifestResourceStream для загрузки файла XML во время выполнения.

Если вы придерживаетесь контентного подхода, имейте в виду, что текущим каталогом вашего процесса может быть не тот, который содержит вашу сборку - вы можете использовать

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

чтобы найти каталог, а затем загрузить соответствующий файл.

2 голосов
/ 16 апреля 2010

Файл с именем App.config в вашем C # проекте будет переименован в MyService.exe.config при его сборке, поэтому вам придется переименовать второй конфигурационный файл, и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...