Подтвердить что ты не робот

Включение ссылки службы из библиотеки классов

У меня есть библиотека классов С# и проект запуска (консольное приложение). Библиотека классов включает ссылку службы на веб-службу. Когда я пытаюсь запустить проект, я получаю InvalidOperationException, потому что проект запуска не читает библиотеку классов app.config и игнорирует ссылку на службу. Чтобы заставить его работать, я вынужден добавить ту же служебную ссылку в проект запуска. Есть ли способ избежать этого? Могу ли я сделать проект запуска распознающим ссылку на службу библиотеки классов и app.config без необходимости скопировать его в проект запуска?

Я попытался добавить ссылку на app.config из библиотеки классов, но это не работает. Библиотека классов не очень переносима, если она требует, чтобы кто-нибудь из них использовал ее для добавления этой ссылки на проект запуска.

4b9b3361

Ответ 1

Подумайте о том, что вы пытаетесь сделать - у вас есть две сборки, которые вы строите:

Library
ConsoleApp

Обе эти сборки имеют файлы конфигурации - я бы предположил, что они выглядят примерно так:

Library
    app.config
ConsoleApp
    ConsoleApp.exe.config

Когда вы запустите ConsoleApp, у него нет возможности прочитать или узнать об aboout app.config из вашей сборки Library. Единственный файл конфигурации, который он знает или заботится, - ConsoleApp.exe.config. Теперь возможно, что файлы конфигурации ссылаются друг на друга, но это не правильное решение для того, что вы пытаетесь сделать.

Поскольку ваша сборка Library не имеет точки входа, она никогда не будет загружена в AppDomain. Поскольку он никогда не будет загружен в AppDomain, его конфигурационный файл приложения никогда не будет использоваться.

Что вы должны сделать, это ссылку Library в ConsoleApp через ссылку на проект. Затем переместите все соответствующие данные конфигурации из app.config в ConsoleApp.exe.config, так как это файл конфигурации, который будет использоваться вашим приложением.

Это позволит вам иметь две вещи, необходимые для вызова методов в вашем веб-сервисе.

  • Код в Library, который может отправлять и получать сообщения SOAP.
  • Метаданные конфигурации, требуемые функцией Library для работы.

Ответ 2

Альтернативой использованию служебной ссылки в библиотеке классов и последующим копированием конфигурации будет использование событий сборки, вызывающих svcutil.exe. То, что мне нравится в этом, - это то, что вам не нужно делать "ссылку на службу обновлений" при изменении службы. Он будет обновляться автоматически.

В библиотеке классов используйте событие сборки, которое генерирует только прокси-код:

svcutil.exe net.tcp://localhost:3315/MyService/mex /noConfig

В приложении используйте событие сборки, которое генерирует конфигурацию. Вы можете использовать параметр /mergeConfig, чтобы объединить его в существующий app.config.

svcutil.exe net.tcp://localhost:3315/MyService/mex 
            /config:App.config /mergeConfig

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

<Target
    Name="PreBuildEvent"
    Condition="'$(PreBuildEvent)'!=''"
    DependsOnTargets="$(PreBuildEventDependsOn)">
  <Exec WorkingDirectory="$(OutDir)"
        Command="$(PreBuildEvent)"
        ContinueOnError="true" />
</Target>

Ответ 3

Вы можете скопировать соответствующие части app.config из конфигурации библиотеки классов в app.config для консольного приложения.

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

Ответ 4

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

Ответ 5

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

Если в библиотеке есть настраиваемые элементы, я бы полностью ожидал, что эта конфигурация в моем файле конфигурации будет правильно потреблять библиотеку.