DataContracts od XSD first!
Jest to nowoczesny sposób i bardzo dobra praktyka, jednak VS2010 ma bardzo ograniczone wsparcie automatyzacji za to. Dlatego usiadłem i napisałem czysty cel msbuild, który: nie wymaga modyfikacji pliku proj i generuje .g.cs. Możesz także łatwo uzyskać kod VB przy pomocy drobnych poprawek w tym pliku.
Instalacja: Skopiuj kod i zapisz go jako plik GenerateDataContractsFromXSD.targets do folderu "C: \ Program Files \ MSBuild \ 4.0 \ Microsoft.Common.targets \ ImportAfter". To sprawia, że msbuild odczytuje go przy każdym uruchomieniu i to samo dotyczy VS2010.
Zastosowanie:
- ReStart VS2010 i dodać XSD do projektu.
- Wybierz plik XSD i naciśnij klawisz F4, aby wyświetlić okno narzędzia właściwości.
- Zmień właściwość działania konstrukcyjnego, aby zawierała wartość GenerateDataContracts
- Utwórz projekt za pomocą pliku XSD. Generuje pierwszy plik .g.cs.
- Obejmij widok w eksploratorze rozwiązań, aby wyświetlić wszystkie pliki w systemie plików.
- Dołącz nowy wygenerowany plik do projektu.
- Dodaj odniesienie do zestawu System.Runtime.Serialization.
Ciesz się.
<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 teraz jestem coraz kolejny błąd. maxOccurs na DownloadRequestItem musi być 1 To jest mój schemat \t elementFormDefault = "kwalifikowany"> \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: Sekwencja> \t \t \t \t \t xs: complexType> \t \t \t \t \t \t \t xs: Sekwencja> \t \t xs: complexType> \t –
Daveo
Czy możesz zaktualizować oryginalne pytanie, edytując je? Umieszczenie XML w komentarzach jest NAPRAWDĘ NAPRAWDĘ trudne do odczytania i bałagan ..... –
wcfBlue http: //wscfblue.codeplex.com/ –