Я ударил эту странную проблему с пространством имен при добавлении моего первого "Service Reference" в проект клиента в Visual Studio 2010.
Если мое пространство имен по умолчанию для проекта использует две или более частей, например. MyCompany.MyApp
, то при добавлении справочника службы создается файл Reference.cs, содержащий пространство имен MyCompany.MyApp.ServiceReferenceName
с большим количеством кода автогенератора с полными именами, например. System.SerializableAttribute
, System.Runtime.Serialization.DataContractAttribute
.
Файл Reference.cs будет заполнен ошибками компиляции, потому что компилятор начинает обрабатывать пространство имен System как суб-элемент пространства имен MyCompany.MyApp
. Вы получаете очень много ошибок в строках:
The type or namespace name 'Runtime' does not exist in the namespace 'MyCompany.MyApp.System'...
Если я изменяю пространство имен в верхней части файла Reference.cs на что-то простое, например. MyCompanyMyApp.ServiceRefernceName
, тогда компилятор ведет себя и распознает ссылки пространства имен System как объявление пространства имен .net System.
На данный момент я использую другое обходное решение, так как я действительно хочу сохранить свои многочастные пространства имен. Моя нынешняя альтернатива - добавить global::
перед ссылками на пространство имен System, чтобы заставить complier делать правильные вещи. Фактически, если мастер "Add Service Reference" использует шаблоны T4, я могу просто изменить их, чтобы внедрить мой обходной путь в исходный код.
Вопросы
Мне бы очень хотелось понять, что происходит здесь, и почему многопользовательское пространство имен вызывает эту проблему. По-видимому, там больше пространства имен, чем я думал. Во-вторых, действительно хотелось бы разработать лучшее решение, чем выполнять глобальное обнаружение/замену каждый раз, когда я добавляю ссылку на службу или обманываю ее с помощью некоторых шаблонов T4.