2012-07-17 18 views
5

Sto scrivendo un servizio WCF che verrà utilizzato ampiamente all'interno della nostra azienda e mi piacerebbe generare i proxy client WCF come parte del processo di compilazione e impacchettarli all'interno un assemblaggio in modo che i clienti del servizio non debbano ripetere questo processo alla fine numerose volte. C'è un modo in cui qualcuno lo sa per realizzare questo? Esistono attività di compilazione preesistenti per MSBuild?Genera proxy WCF come parte del processo di compilazione

risposta

3

Ecco cosa ho finito per fare:

1) Creare il progetto che ha il servizio per il quale voglio generare il codice client

2) Creare un compito MSBuild che esegue le seguenti operazioni:

a) Takes the compiled WCF Service assembly, runs svcutil.exe on it to extract XSD and WSDL metadata for all the services in the Service assembly. 

b) Runs svcutil.exe again, this time on the extracted XSD and WSDL files to generate a .cs file containing the client 

c) Run csc.exe to compile the generated client code into a separate assembly. 

3) Inserire il compito MSBuild in target 'AfterBuild' del progetto contenente il servizio.

Ora ogni volta che costruisco il servizio, ottengo un assembly generato automaticamente che contiene il codice client a cui possono fare riferimento più altri progetti nella nostra azienda, senza dover ricreare/generare lo stesso riferimento Web in più progetti. Possono semplicemente fare riferimento a un singolo assieme e aggiornarsi più facilmente, avendo solo aggiornare una riga in un file di progetto piuttosto che più file generati dal generatore di riferimento web. Se qualcuno è interessato, posso inviare loro il codice per l'attività MSBuild e lo snippet XML per usarlo.

+0

Potrebbe pubblicare il codice per questa soluzione? È esattamente quello che stavo pensando di fare. Come il post qui sotto, ho usato i file batch e voglio fermarmi. – Jonathan

+0

@aloncatz ha approssimativamente l'idea giusta per eseguire i comandi necessari in MSBuild. Quello che ho fatto dopo la mia soluzione sopra ci vuole ancora qualche passo, compilare l'assembly in un pacchetto di nuget e poi pubblicare quel pacchetto di nuget sul server interno di nuget della mia azienda –

0

Non sono a conoscenza di eventuali attività di built-in, questo è come lo faccio:

Creare un progetto, generare la classe proxy tramite svcutil e aggiungerlo al progetto. Crea uno script MSBuild che (1) chiama svcutil e sovrascrive la classe sopra e (2) crea il progetto.

Non otterresti quello che vuoi?

-1

sguardo a T4 di template, e progetti come T4Toolbox

-1

Perché non creare semplicemente un progetto di libreria di classi separato. In quel progetto, usa "Aggiungi riferimento servizio" per ciascuno dei servizi di cui hai bisogno.

Altro codice può quindi utilizzare semplicemente le classi nella libreria di classi.

+1

Perché è incredibilmente manuale, e dovrei mantenere quello come un progetto.In questo modo, posso generare automaticamente l'assembly del client, non devo mai mantenere nulla, e le persone non devono mai trovare il progetto e compilarlo da soli, hanno già l'assembly pronto per l'uso. –

+0

In che modo è manuale, tranne quando inizialmente si creano i riferimenti? Dovresti solo aggiornarli quando i servizi cambiano. Quindi, gestisci l'output di quel progetto esattamente nello stesso modo in cui gestisci qualsiasi altro codice di libreria che hai scritto. –

0

L'approccio MSBuild che hai creato è esattamente quello che voglio ottenere (utilizzando attualmente un file batch). Si prega di inviare/inviare l'attività MSBuild e lo snippet XML!

3

Stavo cercando di risolvere lo stesso problema. Ecco cosa ha finito per fare. Nel file .csproj, nella destinazione AfterBuild, aggiungere un'attività per recuperare il percorso SDK e utilizzare il comando Exec per eseguire svcutil.exe. Ho dovuto usare & quot; perché il percorso contiene spazi.

<Target Name="AfterBuild"> 
    <GetFrameworkSdkPath> 
     <Output TaskParameter="Path" PropertyName="SdkPath"/> 
    </GetFrameworkSdkPath> 
    <Exec Command="&quot;$(SdkPath)bin\NETFX 4.5.1 Tools\svcutil.exe&quot; $(TargetPath)"/> 
</Target> 
Problemi correlati