我希望能够DataContract
从 XSD 文件生成一个,最好使用xsd.exe 工具。它在我的每个项目上自动生成[DataContract]
and的最简单方法是什么?[DataMember]
还是有更好的方法?我试图避免每次更改和重新生成 XSD 文件时都必须重新创建数据合同。
我希望能够DataContract
从 XSD 文件生成一个,最好使用xsd.exe 工具。它在我的每个项目上自动生成[DataContract]
and的最简单方法是什么?[DataMember]
还是有更好的方法?我试图避免每次更改和重新生成 XSD 文件时都必须重新创建数据合同。
该xsd.exe
工具早于 WCF 并且不知道任何关于[DataContract]
和[DataMember]
. 如果确实使用xsd.exe
,则必须将 WCF 切换为使用XmlSerializer
代替其默认值DataContractSerializer
来序列化数据协定。
WCF 的等价物xsd.exe
是svcutil.exe
- 它有一个参数/dconly
,它只从给定的 XSD 文件创建数据协定。这将为您生成一个 C# 或 VB.NET 文件,其中包含经过良好注释的数据协定。
用法:
svcutil.exe (name of your XSD).xsd /dconly
这将在您的目录中生成一个具有相同基本名称的 *.cs 文件。
根据我的经验,svcutil.exe
它对它的 XML 结构非常挑剔——所以如果它向你发出大量警告和/或错误,请不要感到惊讶。
使用 svcutil.exe 而不是 xsd.exe
如何使用 ?转到开始菜单 --> Microsoft Visual Studio 2008 --> Visual Studio 工具 --> Visual Studio 2008 命令提示符
并更改您想要的目录或将目录更改为您的 xsd 在那里。
svcutil.exe /help
它将列出所有选项。
我用来生成数据合同的选项之一是
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\