Включая сервисную ссылку из библиотеки классов - PullRequest
22 голосов
/ 09 февраля 2009

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

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

Ответы [ 5 ]

15 голосов
/ 09 февраля 2009

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

Library
ConsoleApp

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

Library
    app.config
ConsoleApp
    ConsoleApp.exe.config

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

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

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

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

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

Альтернативой использованию ссылки на службу в библиотеке классов и последующему копированию конфигурации может быть использование событий сборки, вызывающих 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>
1 голос
/ 09 февраля 2009

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

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

0 голосов
/ 09 февраля 2009

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

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

0 голосов
/ 09 февраля 2009

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

...