27

できればxsd.exe ツールDataContractを使用して、XSD ファイルからを生成できるようにしたいと考えています。各アイテムにandを自動生成する最も簡単な方法は何ですか?[DataContract][DataMember]

または、より良いアプローチがありますか?XSD ファイルが変更および再生成されるたびにデータ コントラクトを再作成する必要がないようにしています。

4

4 に答える 4

45

この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 構造について非常にうるさいので、大量の警告やエラーが表示されても驚かないでください。

于 2010-02-03T06:07:33.710 に答える
12

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

コーディングを続けてください。

于 2010-11-29T22:03:33.213 に答える
3

最初にXSDからのDataContracts!

これは最新の方法であり、非常に優れた方法ですが、VS2010の自動化サポートは非​​常に限られています。したがって、私は座って純粋なmsbuildターゲットを作成しました。これは、projファイルの変更を必要とせず、.g.csを生成します。このファイルを少し調整するだけで、VBコードを非常に簡単に生成することもできます。

インストール:コードをコピーして、GenerateDataContractsFromXSD.targetsファイルとしてフォルダー'C:\ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets\ImportAfter'に保存します。これにより、msbuildは起動するたびにそれを読み取るようになり、VS2010にも同じことが当てはまります。

使用法:

  • VS2010を再起動し、プロジェクトにxsdを追加します。
  • XSDファイルを選択し、F4キーを押してプロパティツールウィンドウを表示します。
  • ビルドアクションプロパティを変更して、値GenerateDataContractsを含めます
  • XSDファイルを使用してプロジェクトをビルドします。最初の.g.csファイルを生成します。
  • ソリューションエクスプローラーのビューを変更して、ファイルシステム上のすべてのファイルを表示します。
  • 新しく生成されたファイルをプロジェクトに含めます。
  • System.Runtime.Serializationアセンブリへの参照を追加します。

楽しみ。

<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 &quot;$(DataContractGeneratedFilePath)&quot;" />

    <Exec
      Condition="'@(DataContractItems)' != ''"
      Outputs="$(DataContractGeneratedFilePath)"
      Command="&quot;$(WIN_SDK_PATH)bin\SvcUtil.exe&quot; @(SvcUtilParam, ' ') @(GenerateDataContracts -> '%(DataContractSchemaMapping)') &quot;/out:$(DataContractGeneratedFilePath)&quot; &quot;%(DataContractItems.FullPath)&quot;" />

  </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>
于 2012-03-08T15:10:37.867 に答える
1

64 ビット マシンでは、次の場所にあります。

%systemdrive%\Program Files (x86)\MSBuild\<version you use>

この場合:

%systemdrive%\Program Files (x86)\MSBuild\4.0\Microsoft.Common.Targets\ImportAfter\
于 2014-09-15T10:09:14.253 に答える