2012-01-09 25 views
4

是否有可能使用svcutil重用/排除引用類型,就像visual studio一樣。svcutil exlude/reuse refrenced assemblies

我有多個項目,我的類型/數據模型存儲在單獨的程序集中,因此它們可以被其他非wcf項目等使用。更新視覺工作室GUI中的參考時,這一切都可以很好地工作。只要在邊界的兩側都找到了類型,它就不在代理中定義的beeing中。

如何使用svcutil實現相同的功能?

更清楚我想從dll生成代理,而不是包含servicecontract的正在運行的服務。同時,我想提供包含共享類型的dll文件,這些文件應該從代理中定義的beeing中排除。

所有這些的原因是允許我的項目更新並構建在buildserver上。

編輯: 首先感謝您的回覆和參數建議。但是,我沒有得到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) 

(名稱被scrambeled :))

Brgds, 了Stian

回答

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的有用於這項工作。 另一個煩惱是,如果使用類型如datatables/datasets等(不是他們真的應該這樣做),他們的程序集必須包含或svcutil會搞亂生成元數據。

IE:

SET SHAREDASSEMBLIES=%SHAREDASSEMBLIES% /r:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll 
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

如果您沒有參數運行svcutil,您會看到它有幾個功能。我認爲你可以用兩次調用來做你想做的事情:

  • 一個從你的二進制生成元數據,命令行如svcutil /serviceName:<myServiceName> <pathToAssemblyWithConfigFile>。這會輸出.wsdl和.xsd文件。
  • 另一種方法是從元數據中生成代碼,並使用開關指定在哪裏找到數據合同的現有類型:svcutil /reference:<assemblyPath> *.wsdl *.xsd

我試過在一步之前這樣做,但是當svcutil處於「代碼生成」模式時,它期望元數據作爲輸入,而不是程序集。因此首先生成元數據!

+0

嗨感謝您的答覆。使用給定的命令運行util仍然會在我的代理中生成部分類,而不是從正確的名稱空間引用它們。 – 2012-01-13 09:09:47

+0

如果第二個(代碼生成)發生了什麼,除了指定'reference'開關,還指定'excludeType'? 例如'svcutil/reference: /excludeType:name.space.type1 /et:name.space.type2 * .wsdl * .xsd'。 – shambulator 2012-01-13 10:57:53

+0

好消化!但是我仍然得到完全相同的結果。 – 2012-01-13 11:26:39