Я думаю, что Вы ищете, SM_CYCAPTION
- это - высота строки заголовка. SM_CYBORDER
высота горизонтальных краев окна.
Я добавил описание этого решения в свой блог. На самом деле информация та же, но, возможно, немного менее фрагментированная
. Я нашел альтернативу использованию svcutil.exe
для достижения того, что я хочу. Это (imo) упрощает обновление ссылки на службу, чем повторный запуск утилиты.
Вы должны явно указать uri пространства имен в вашем ServiceContract и DataContracts ( см. Ниже комментарий ).
[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
[OperationContract]
CompositeType GetData();
}
[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
// Whatever
}
Пространство имен могло бы быть чем угодно, но технически это должен быть действительный uri, поэтому я выбрал эту схему. Возможно, вам придется выполнить сборку вручную, чтобы все заработало позже, так что сделайте это.
Как только это будет сделано, включите параметр Показать все файлы в обозревателе решений. Разверните ссылку на службу, которую вы добавили ранее. Дважды щелкните ссылку . svcmap
.
Там будет элемент
, который вам нужно будет отредактировать. Продолжая мой пример:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
Сохраните файл, щелкните правой кнопкой мыши ссылку на службу и выберите Обновить ссылку на службу .
Вы можете добавить столько отображений, сколько вам нужно (мне действительно понадобилось два). Эффект аналогичен подходу svcutil / namespace:
, но без использования самой утилиты командной строки, что упрощает обновление.
Обратной стороной этого подхода является что вам нужно использовать явные сопоставления пространств имен. Используя svcutil
, у вас есть возможность сопоставить все, что явно не отображено, как это (решение, о котором говорил Джон Сондерс):
svcutil /namespace:*,MyCompany.Services.MyProduct ...
Вы можете подумать использовать:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="*"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
, но это не будет работа, потому что Visual Studio уже неявно добавляет это сопоставление, указывая на сгенерированное имя пространства имен, от которого мы пытаемся избавиться. Приведенная выше конфигурация приведет к тому, что Visual Studio будет жаловаться на повторяющийся ключ.
Объявление явных пространств имен :
Если в вашем коде не указано пространство имен эксплитов, кажется , что .NET сгенерирует uri в форме http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct
. Вы можете сопоставить это так же хорошо, как явные пространства имен в моем примере, но я не знаю, есть ли какие-либо гарантии такого поведения. Поэтому использование явного пространства имен может быть лучше.
NB: сопоставление двух TargetNamespaces с одним и тем же ClrNamespace, похоже, нарушает генерацию кода
Ваш вариант использования был неправильным.
Вы никогда не должны были включать службу в качестве ссылки в первую очередь.
Я считаю, что svcutil.exe примет переключатель, указывающий полное пространство имен использовать.