DataContracts von XSD zuerst!
Es ist die moderne Art und sehr gute Praxis, jedoch hat VS2010 sehr begrenzte Automatisierungsunterstützung dafür. Daher habe ich mich hingesetzt und ein reines msbuild target geschrieben, das: keine proj Dateiänderungen benötigt und generiert .g.cs. Sie können auch leicht VB-Code mit kleinen Verbesserungen in dieser Datei erzeugen.
Instalaktion: Kopieren Sie den Code und speichern Sie ihn als GenerateDataContractsFromXSD.targets-Datei in den Ordner 'C: \ Programme \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter'. Dies macht msbuild es jedes Mal zu lesen, und es gilt auch für VS2010.
Verbrauch:
- ReStart VS2010 und ein XSD in Ihrem Projekt hinzufügen.
- Wählen Sie die XSD-Datei und drücken Sie F4, um das Werkzeugfenster Eigenschaften anzuzeigen.
- Ändern Sie die Buildaktionseigenschaft so, dass sie den Wert enthält GenerateDataContracts
- Erstellen Sie das Projekt mit der XSD-Datei. Es generiert die erste .g.cs-Datei.
- Ändern Sie die Ansicht im Projektmappen-Explorer, um alle Dateien im Dateisystem anzuzeigen.
- Fügen Sie die neu generierte Datei in das Projekt ein.
- Fügen Sie einen Verweis auf die System.Runtime.Serialization-Assembly hinzu.
Genießen.
<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>
Ok ich jetzt einen anderen Fehler. maxOccurs auf DownloadRequestItem muss 1 sein Das ist mein Schema \t ElementFormDefault- = "qualified"> \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t xs: sequence> \t \t \t \t \t xs: complextype> \t \t \t \t \t \t \t xs: sequence> \t \t xs: complextype> \t –
Daveo
können Sie bitte Ihre ursprüngliche Frage aktualisieren, indem Sie es bearbeiten? XML in Kommentare einfügen ist wirklich wirklich schwer zu lesen und ein Durcheinander ..... –
wcfBlue http: //wscfblue.codeplex.com/ –