如何从WSDL和XSD生成带有注释的.NET类

4

有一些XSD和WSDL文件,我想从它们生成C#代码。我使用了svcutil.exe,但它没有从XSD注释中生成XML注释:

<annotation>
    <documentation>VERY USEFULL DOCUMENTATION</documentation>
</annotation>

我希望在生成的文件中包含以下内容:

public class SomeData
{
    /// <summary>
    /// VERY USEFULL DOCUMENTATION
    /// </summary>
    public string SomeField
    {...}
}

另一个问题:如何强制 svcutil.exe 为每个类生成一个文件?(我知道可以使用 Resharper 的重构功能将类移动到单独的文件中,但我不喜欢这种解决方案)
那么,如何从 XSD 和 WSDL 生成具有 XML 注释的多个文件(每个类一个文件)?

你的问题已经包含了答案。这个工具并不能做到你想要的。 - John Saunders
为什么您想把它们放到不同的文件里?这些类型是由工具生成的,您不应该更改它们。无论它们在一个文件中还是分散在多个文件中,您都不应该关心每个文件中的内容。 - John Saunders
John,我想这样做是因为我们的代码政策 :) - Jarlaxle
这些政策不应适用于生成的代码。例如,你们的政策是否适用于Windows Forms .Designer.cs文件?如果工具生成这些文件,并且它们不被人类阅读,那么大多数政策不应适用于它们。你们的命名约定政策是否适用?如果一个字段被命名为"javaStyleName",你们会要求将其重命名为"JavaStyleName"吗? - John Saunders
这段代码将被用于我们的需求。首先,它是从某个标准的定义中生成的。我们使用这个标准作为构建自己基础设施的起点。因此,虽然这段代码是生成的,但它将被用作正常的人工编辑代码。 - Jarlaxle
3个回答

6
你可能可以使用 WCFExtras+ http://wcfextrasplus.codeplex.com/
  1. Make WCFExtras.dll visible to svcutil.exe (such as by putting them in the same directory)
  2. add this section to the app.config of the client app, or place in a new config file and invoke svcutil with the /svcutilConfig switch

     <configuration>
      <system.serviceModel>
        <client>
          <metadata>
            <wsdlImporters>
              <extension type="WCFExtras.Wsdl.Documentation.XmlCommentsImporter, WCFExtras" />
            </wsdlImporters>
          </metadata>
        </client>
      </system.serviceModel>
    </configuration>
    

以下是一个命令行示例,其中configfile.xml是上述配置文件: SvcUtil.exe [服务 URL] /svcutilConfig:[配置文件路径]


4
针对未来读者:WCFExtras命名空间已更改为WFCExtrasPlus,其程序集名称也是如此。如果您使用完全限定名称,请确保使用正确的版本和公钥标记,这些信息可以在库的文档页面(或程序集本身)的评论中找到。主要文档已经很久没有更新了,并引用了现已过时的版本号作为公钥标记。 - Maverik
对我不起作用。Svcutil报错“错误:工具中发生错误。 错误:对象引用未设置到对象的实例。” - Anton Krouglov

1
我刚刚了解到xsd2Code Visual Studio插件。它可以将Xsd注释/文档移动到C# XML文档摘要标签中,完全符合您的需求。
CodePlex上有一个社区版本。付费版本还具有其他不错的高级功能,因此我决定支付45美元购买一年许可证。注意:我不是该公司的一员,只是一位满意的客户。
Scott Crowder

xsd2Code很好用。我也购买了付费版本。它有两个主要缺点:它仅支持模式(没有wsdl/合同);一些可空的xml属性(例如十进制数)在代码生成时无法正确处理,因此您必须手动编写代码。 - Anton Krouglov

-1

答案的关键部分是,目前没有办法使标准工具(如随 Windows SDK 提供的 wsdl.exe 或 svcutil.exe)生成的代理文件进行预处理。您需要一个单独的工具来预处理生成的代理文件。

除了其他答案中提到的工具之外,如果您的服务定义具有 annotation/documentation 元素,则 FancyWsdl 也可以在您的 C# 代码中创建适当的摘要标签:

FancyWsdl 对由诸如 wsdl.exesvcutil.exeVisual Studio > Add Service Reference 等工具生成的 WSDL 服务定义的 C# 代理代码进行后处理,并引入以下增强功能:

  • 使类型和成员重命名成为可能
  • 应用 C# 命名约定(PascalCase)
  • 插入文档(摘要标签)
  • 清理代码
从 WSDL 文件生成 C# 代理类,例如:
  • wsdl.exe https://example.com/ExampleService/?wsdl
  • svcutil.exe https://example.com/ExampleService/?wsdl
  • Visual Studio > 添加服务引用
运行 FancyWsdl 在生成的代码上传递服务定义,例如:
fancywsdl.exe ExampleService.cs https://example.com/ExampleService/?wsdl https://example.com/ExampleData.xsd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接