できればxsd.exe ツールDataContract
を使用して、XSD ファイルからを生成できるようにしたいと考えています。各アイテムにandを自動生成する最も簡単な方法は何ですか?[DataContract]
[DataMember]
または、より良いアプローチがありますか?XSD ファイルが変更および再生成されるたびにデータ コントラクトを再作成する必要がないようにしています。
できればxsd.exe ツールDataContract
を使用して、XSD ファイルからを生成できるようにしたいと考えています。各アイテムにandを自動生成する最も簡単な方法は何ですか?[DataContract]
[DataMember]
または、より良いアプローチがありますか?XSD ファイルが変更および再生成されるたびにデータ コントラクトを再作成する必要がないようにしています。
このxsd.exe
ツールは WCF よりも前のもので[DataContract]
あり、 とについて何も知りません[DataMember]
。を使用する場合はxsd.exe
、WCF を切り替えて、データ コントラクトのシリアル化にXmlSerializer
デフォルトの代わりにを使用する必要があります。DataContractSerializer
WCF に相当するものxsd.exe
は、指定された XSD ファイルからデータ コントラクトのみを作成svcutil.exe
するパラメーターがあります。/dconly
これにより、適切に注釈が付けられたデータ コントラクトを含む C# または VB.NET ファイルが生成されます。
使用法:
svcutil.exe (name of your XSD).xsd /dconly
これにより、ディレクトリ内に同じベース名で *.cs ファイルが生成されます。
私の経験でsvcutil.exe
は、 はその XML 構造について非常にうるさいので、大量の警告やエラーが表示されても驚かないでください。
xsd.exe の代わりに svcutil.exe を使用する
使い方 ?[スタート] メニューに移動します --> Microsoft Visual Studio 2008 --> Visual Studio ツール --> Visual Studio 2008 コマンド プロンプト
必要なディレクトリを変更するか、ディレクトリをxsdがある場所に変更します。
svcutil.exe /help
すべてのオプションがリストされます。
データ契約のみを生成するために使用するオプションの1つは
svcutil.exe /target:code /n:*,[Your Company and Department].Common.DataTransferObjects /dataContractOnly /serializer:auto /importXmlTypes common.xsd /out:common.cs
コーディングを続けてください。
最初にXSDからのDataContracts!
これは最新の方法であり、非常に優れた方法ですが、VS2010の自動化サポートは非常に限られています。したがって、私は座って純粋なmsbuildターゲットを作成しました。これは、projファイルの変更を必要とせず、.g.csを生成します。このファイルを少し調整するだけで、VBコードを非常に簡単に生成することもできます。
インストール:コードをコピーして、GenerateDataContractsFromXSD.targetsファイルとしてフォルダー'C:\ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets\ImportAfter'に保存します。これにより、msbuildは起動するたびにそれを読み取るようになり、VS2010にも同じことが当てはまります。
使用法:
楽しみ。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Inject into the sequence of targets in order to add a generated file to compile -->
<PropertyGroup>
<CoreCompileDependsOn>
GenerateDataContractsFromXSD;
$(CoreCompileDependsOn);
</CoreCompileDependsOn>
</PropertyGroup>
<ItemGroup>
<SvcUtilParam Include="/nologo" />
<SvcUtilParam Include="/target:code" />
<SvcUtilParam Include="/dataContractOnly" />
<SvcUtilParam Include="/serializer:DataContractSerializer" />
<SvcUtilParam Include="/language:csharp" />
<SvcUtilParam Include="/enableDataBinding" />
<SvcUtilParam Include="/serializable" />
<SvcUtilParam Include="/internal" />
</ItemGroup>
<ItemGroup>
<AvailableItemName Include="GenerateDataContracts">
<Targets>GenerateDataContractsFromXSD</Targets>
</AvailableItemName>
</ItemGroup>
<ItemDefinitionGroup>
<GenerateDataContracts>
<!-- Use the following options to pass serialization options to SVCUTIL -->
<DataContractSchemaMapping>"/n:*,$(AssemblyName).Data"</DataContractSchemaMapping>
</GenerateDataContracts>
</ItemDefinitionGroup>
<!-- Automated Data Contract Serialisation using the SvcUtil.Exe tool -->
<!-- in order to make it automated you have to set the build tool in properties window to GenerateDataContracts -->
<Target Name="GenerateDataContractsFromXSD"
Inputs="@(GenerateDataContracts)"
Outputs="%(GenerateDataContracts.RootDir)\%(GenerateDataContracts.Directory)%(GenerateDataContracts.Filename).g.cs">
<ItemGroup>
<DataContractItems Include="@(GenerateDataContracts -> '%(FullPath)')" Condition="'%(Extension)' == '.xsd'" />
</ItemGroup>
<PropertyGroup>
<DataContractGeneratedFilePath>%(DataContractItems.RootDir)\%(DataContractItems.Directory)%(DataContractItems.Filename).g.cs</DataContractGeneratedFilePath>
<DataContractGeneratedIdentifier>@(GenerateDataContracts -> '%(RelativeDir)')%(DataContractItems.Filename).g.cs</DataContractGeneratedIdentifier>
</PropertyGroup>
<GetFrameworkSdkPath>
<Output TaskParameter="Path" PropertyName="WIN_SDK_PATH" />
</GetFrameworkSdkPath>
<Exec
Condition="'@(DataContractItems)' != ''"
Command="attrib -r "$(DataContractGeneratedFilePath)"" />
<Exec
Condition="'@(DataContractItems)' != ''"
Outputs="$(DataContractGeneratedFilePath)"
Command=""$(WIN_SDK_PATH)bin\SvcUtil.exe" @(SvcUtilParam, ' ') @(GenerateDataContracts -> '%(DataContractSchemaMapping)') "/out:$(DataContractGeneratedFilePath)" "%(DataContractItems.FullPath)"" />
</Target>
<Target Name="GetCopyGenerateDataContractItems"
AfterTargets="AssignTargetPaths">
<ItemGroup>
<DataContractItems Include="@(GenerateDataContracts -> '%(FullPath)')" Condition="'%(Extension)' == '.xsd'" />
</ItemGroup>
<AssignTargetPath Files="@(DataContractItems)" RootFolder="$(MSBuildProjectDirectory)">
<Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
</AssignTargetPath>
</Target>
</Project>
64 ビット マシンでは、次の場所にあります。
%systemdrive%\Program Files (x86)\MSBuild\<version you use>
この場合:
%systemdrive%\Program Files (x86)\MSBuild\4.0\Microsoft.Common.Targets\ImportAfter\