svcutil исключить / повторно использовать сборку - PullRequest
4 голосов
/ 09 января 2012

Можно ли использовать svcutil для повторного использования / исключения ссылочных типов, как в Visual Studio.

У меня есть несколько проектов, мои типы / датамодели хранятся в отдельных сборках, поэтому они могут использоваться другими проектами, не относящимися к wcf и т. Д. При обновлении ссылок в графическом интерфейсе Visual Studio все это прекрасно работает. Пока тип найден по обе стороны границы, он исключен из списка, определенного в прокси.

Как мне добиться того же, используя svcutil?

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

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

Edit: Прежде всего, спасибо за ваш ответ и предложение параметров. Однако я не получаю svcutil повторного использования сборок, следуя вашим инструкциям.

Вот части файла .bat, который я сделал. Я исключил все флаги для генерации INotifyPropertyChanged и т. Д.

SET BACKENDROOT=C:\SomePath\Development\Backend\bin
SET DATAMODELSBASE=C:\SomePath\Development\DataModels\bin
SET COMMONBASE=C:\SomePath\Development\Common\bin

SET REFRENCED_ASSEMBLIES=/r:%DATAMODELSBASE%\Jall.DataModels.Consignment.dll

svcutil %BACKENDROOT%\Jall.Backend.Consignment.DLL /t:metadata
svcutil /o:test.cs %REFRENCED_ASSEMBLIES% *.wsdl *.xsd

Результат выглядит следующим образом:

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
   [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/KSD.DataModels.Consignment")]
public partial class ExtInvoice : OrmBase
{

private System.DateTime buyersOrderDateField;

private bool buyersOrderDateFieldSpecified;

private string buyersOrderNumberField;

private string compCodeField;
.....

А у клиента это само:

public Address CreateNewAddress(int TK, string AddressType)

Это неверно, модели данных генерируются непосредственно в прокси. Клиент не просто пропускает их и использует правильное пространство имен для типов. Правильный результат должен быть:

public Jall.DataModels.Consignment.Address CreateNewAddress(int TK, string AddressType)

(имена взбираются :))

Brgds, Stian

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

Спасибо за вашу помощь. Со временем это сработало с помощью следующих команд:

SET BACKENDROOT=C:\SomePath\Development\Backend\bin
SET DATAMODELSBASE=C:\SomePath\Development\DataModels\bin
SET OUTFOLDER=C:\SomeOutputFolder
SET REFRENCED_ASSEMBLIES=/r:%DATAMODELSBASE%\Jall.DataModels.Consignment.dll
SET REFRENCED_ASSEMBLIES=%REFRENCED_ASSEMBLIES% /r:%DATAMODELSBASE%\Jall.DataModels.SomethingElse.dll

SET SVCFLAGS=/enableDataBinding /s /a /tcv:Version35

::Generate metadata
svcutil %BACKENDROOT%\Jall.Backend.Consignment.DLL /t:metadata -d:%OUTPUTFOLDER%

::Generate proxy with shared types
svcutil %OUTPUTFOLDER%\*.wsdl %OUTPUTFOLDER%\*.xsd %SVCFLAGS% /ser:DataContractSerializer %REFERENCED_ASSEMBLIES /o:test.cs

Обратите внимание, что / ser: DataContractSerializer должен был использоваться, чтобы это работало. И еще одно неудобство заключается в том, что если используются такие типы, как наборы данных / наборы данных и т. Д. (Не то, что они действительно должны, хотя), их сборки должны быть включены, иначе svcutil испортит генерацию метаданных.

IE:

SET SHAREDASSEMBLIES=%SHAREDASSEMBLIES% /r:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll
3 голосов
/ 09 января 2012
svcutil /?

дает

/reference:<file path> - Add the specified assembly to the set of assemblies 
                         used for resolving type references. If you are 
                         exporting or validating a service that uses 3rd-party
                         extensions (Behaviors, Bindings and BindingElements)
                         registered in config use this option to locate 
                         extension assemblies that are not in the GAC.  
                         (Short Form: /r)

Таким образом, выполнение svcutil с /r:myassembly.dll должно сделать это.

1 голос
/ 09 января 2012

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

  • Один для генерации метаданных из вашего двоичного файла с командной строкой, подобной svcutil /serviceName:<myServiceName> <pathToAssemblyWithConfigFile>. Это выводит файлы .wsdl и .xsd.
  • Другой для генерации кода из метаданных с переключателями, указывающими, где найти существующие типы для контрактов данных: svcutil /reference:<assemblyPath> *.wsdl *.xsd.

Я пытался сделать это за один шаг, но когда svcutil находится в режиме «генерации кода», он ожидает метаданные как ввод, а не как сборки. Поэтому сначала создайте метаданные!

...