是否可以使用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
答案 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处于“代码生成”模式时,它会将元数据作为输入,而不是程序集。所以先生成元数据!