App.config AppSettings возвращает значение null

#c# #wcf #app-config

#c# #wcf #app-config

Вопрос:

У меня есть проект, который является клиентом WCF, использующим конечные точки netTcp. Проект компилируется в DLL, на которую ссылается другой проект. Я использую AppSettings для переключения между локальными и удаленными конечными точками ip следующим образом:

     public EmbeddedClient()
    {
        //Grab ip to use: remote or local (used for simulator)
        String location = ConfigurationSettings.AppSettings["ipAddress"];
        String ip = ConfigurationSettings.AppSettings[location];

        //Default to localhost if no appsetting was found
        if (ip == null)
            ip = "localhost";

        String address = String.Format("net.tcp://{0}:9292/EmbeddedService", ip);

        //Setup the channel to the service...
        channelFactory = new ChannelFactory<IEmbeddedService>(binding, new EndpointAddress(address));

    }
 

В моем App.Config находятся мои настройки приложений и конечные точки WCF:

   <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  <appSettings>
    <add key="ipAddress" value="local"/>
    <!-- Replace above value to "local" (Simulator) or "remote" (Harware)-->
    <add key="local" value="localhost"/>
    <add key="remote" value="192.168.100.42"/>
  </appSettings>

  <system.serviceModel>
      <!--WCF Endpoints go here--->
  </system.serviceModel>
  </configuration>
 

Когда я компилирую проект, appsetting всегда возвращает значение null. Я также заметил, что app.config переименован во что-то вроде Embedded_DCC_Client.dll.config после компиляции. Почему он не может найти мои appsettings? Почему он возвращает null? Спасибо.

Комментарии:

1. Можете ли вы показать соответствующие (конфигурационные) файлы?

Ответ №1:

Похоже, вы пытаетесь использовать конфигурационный файл с DLL — это не сработает. Вам необходимо установить настройки вашего приложения и настройки, зависящие от WCF, в файле приложения приложения, которое ссылается на библиотеку DLL WCF. Эта DLL будет использовать конфигурационный файл вызывающего приложения.

Другими словами:

MyWCF.dll — это ваша библиотека DLL WCF.

MyApplication.exe — это приложение, которое ссылается WCF.DLL .

Вы должны поместить настройки своего приложения и настройки system.ServiceModel в файл app.config MyApplication.exe . MyWCF.Затем DLL должна прочитать значения из этой конфигурации.

Комментарии:

1. Спасибо, Тим. Это сработало. Я заметил, что App.config переименовывается во что-то вроде MyApplication.exe.config. Должно ли это быть так?

2. @RyanR — Компилятор .NET делает это по умолчанию. Я не знаю, есть ли способ переопределить или изменить это — я просто оставляю все как есть.

Ответ №2:

Файл настроек приложения загружается из контекста запускаемого приложения, поэтому он должен быть либо в этом проекте, либо ссылаться на него из проекта запуска.

Комментарии:

1. Спасибо за ваш ответ, Декер, но я могу выбрать только один.

2. Вам не нужно иметь файл конфигурации в указанной dll, только запускаемый exe.

Ответ №3:

Папка, используемая для установки утилиты, должна содержать Exe-файл, поддерживающий dll и exe.config-файл