svcutil排除/重用引用的程序集

时间:2012-01-09 09:17:16

标签: .net wcf svcutil.exe

是否可以使用svcutil来重用/排除引用的类型,就像使用visual studio一样。

我有多个项目,我的类型/数据模型存储在单独的程序集中,因此它们可以被其他非wcf项目等使用。在visual studio gui中更新refrence时,这一切都很好。只要在边框的两侧都找到了类型,就会将其排除在代理中定义的范围之外。

如何使用svcutil实现相同的功能?

更清楚我想从dll生成代理,而不是包含servicecontract的正在运行的服务。同时我想提供包含共享类型的dll文件,这些文件应该从代理中定义的beeing中排除。

所有这一切的原因是允许我的项目在构建服务器上更新和构建。

编辑: 首先,感谢您的回复和参数建议。但是,我没有按照你的指示重新使用程序集。

以下是我制作的.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 个答案:

答案 0 :(得分:3)

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 :(得分:3)

感谢您的帮助。 最终使用以下命令完成此工作:

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

答案 2 :(得分:1)

如果你运行svcutil没有参数,你会发现它有几个函数。我想你可以通过两次调用做你想做的事情:

  • 使用命令行svcutil /serviceName:<myServiceName> <pathToAssemblyWithConfigFile>从二进制文件生成元数据。这会输出.wsdl和.xsd文件。
  • 另一个从元数据生成代码,其中的开关指定在何处查找数据协定的现有类型:svcutil /reference:<assemblyPath> *.wsdl *.xsd

我之前尝试过这一步,但是当svcutil处于“代码生成”模式时,它会将元数据作为输入,而不是程序集。所以先生成元数据!