社内で広く使用される WCF サービスを作成しています。ビルド プロセスの一部として WCF クライアント プロキシを生成し、それらをアセンブリ内にパッケージ化して、サービスのクライアントがプロキシを持たないようにしたいと考えています。このプロセスを何度も繰り返します。これを達成するために誰かが知っている方法はありますか? MSBuild の既存のビルド タスクはありますか?
5 に答える
私は同じ問題を解決しようとしていました。これが最終的にやったことです。.csproj の AfterBuild ターゲットの下に、SDK パスをフェッチするタスクを追加し、Exec コマンドを使用して svcutil.exe を実行します。" を使用する必要がありました。パスにスペースが含まれているためです。
<Target Name="AfterBuild">
<GetFrameworkSdkPath>
<Output TaskParameter="Path" PropertyName="SdkPath"/>
</GetFrameworkSdkPath>
<Exec Command=""$(SdkPath)bin\NETFX 4.5.1 Tools\svcutil.exe" $(TargetPath)"/>
</Target>
これが私がやったことです:
1)クライアントコードを生成したいサービスを持つプロジェクトを作成します
2)次のことを行うMSBuildタスクを作成します。
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)サービスを含むプロジェクトの「AfterBuild」ターゲットにMSBuildタスクを挿入します。
これで、サービスをビルドするたびに、複数のプロジェクトで同じWeb参照を再/生成しなくても、社内の他の複数のプロジェクトが参照できるクライアントコードを含む自動生成されたアセンブリを取得できます。Web参照ジェネレーターによって生成された複数のファイルではなく、プロジェクトファイルの1行を更新するだけで、単一のアセンブリを参照するだけで、より簡単に更新できます。興味があれば、MSBuildタスクのコードとそれを使用するためのXMLスニペットを送信できます。
私は組み込みのタスクを認識していません、これは私がそれを行う方法です:
プロジェクトを作成し、svcutilを介してプロキシクラスを生成し、それをプロジェクトに追加します。(1)svcutilを呼び出して上記のクラスを上書きし、(2)プロジェクトをビルドするMSBuildスクリプトを作成します。
それはあなたが望むものを達成しませんか?
T4
テンプレートや、T4Toolbox などのプロジェクトを見てください。
別のクラス ライブラリ プロジェクトを単純に作成してみませんか。そのプロジェクトで、必要なサービスごとに「サービス参照の追加」を使用します。
他のコードは、クラス ライブラリ内のクラスをそのまま使用できます。