4

谷歌搜索了一下后,没有明确的答案是否 Visual Studio 2008 使用 svcutil.exe 与否?Visual Studio 2005 确实使用了它,但是 Visual Studio 2008 的 RTM 版本使用 svcutil 吗?一些博客说它没有(并让它看起来令人惊讶)

和其他网站说有。

我要问的原因是我们正在使用自定义端点行为扩展(IWsdlExportExtension/IEndpointBehavior 的实现)来展平我们的 WCF wsdl,并通过 Visual Studio 2008 的添加引用使用展平的 wsdl 给我们编译错误,因为它正在复制类型/类。引用已添加,没有任何错误。另一方面,SvcUtil 将重复的类扔到一个单独的命名空间中,从而解决了构建问题。

所以 SvcUtil 可以工作,但是 Visual Studio 2008 在我们的一些扁平化 wsdls 上没有。如果 Visual Studio 中的添加服务引用不起作用,我们可以继续使用 svcutil,但想知道是否有人知道这样做是否有任何影响。我找不到任何证据表明我们“不应该”使用 svcutil,只是它不像在 Visual Studio 2008 中使用添加服务引用那么容易。

4

5 回答 5

4

svcutil 和 VS2008 最终调用了相同的 WCF 代码。它是否使用实际的 exe 或调用 dll 是一个次要细节。如果有的话,我更喜欢命令行工具,因为它允许更大的灵活性(或者我可能只是喜欢命令行;-p)。

请注意,WCF 可以通过 IDE 和命令行 (/r?) 重用现有类型。但是这种类型的命名空间问题只是我喜欢使用命令行版本的许多事情之一。

于 2009-07-22T13:20:06.573 回答
1

这是一个老问题,当我在寻找类似的东西时出现了,所以我会提到我发现的。

这篇博文断言 VS2008 不使用 svcutil 来生成代理。我同意他的观点,因为当您添加服务引用时,svcutil 不会出现在任务管理器进程列表中。它们还会产生明显不同的输出 - 例如 svcutil 不会产生可在 Silverlight 应用程序中使用的代理,您必须从中修剪出合理数量的东西(如程序集中不可用的接口或对象引用)银光可以使用*)。

尽管如此,编写一个调用 svcutil 的小应用程序来完成繁重的工作然后对生成的文件进行清理并不难。

*可以通过使用/targetClientVersion开关指定不同的框架版本来避免这个问题,但我还没有尝试过。

于 2010-01-07T11:18:19.083 回答
1

我从来没有看到有任何理由相信 Visual Studio 调用了 svcutil.exe 或 wsdl.exe。在这两种情况下,控制台应用程序和 Visual Studio 都使用相同的 .NET Framework 代码来完成它们的工作。

考虑在“添加服务引用”命令期间发生的一些错误显示在 Visual Studio“错误”窗口中,而不是在“输出”窗口中。必须调用 Visual Studio API 才能将消息放入错误窗口,而 svcutil.exe 无法做到这一点。

于 2009-07-22T13:20:38.087 回答
0

我宁愿说 Visual Studio 2008 没有使用 svcutil.exe。好吧,至少不是直接的。

我使用 Process Monitor 查看在我的机器上执行了哪些应用程序,同时向我的项目添加新的服务引用,并且在日志中找不到“svcutil”。

于 2009-07-22T13:14:14.740 回答
-1

我会说 Visual Studio 2008 确实使用 svcutil 来生成代理代码。

作为证明,只需使用 Visual Studio 生成代理代码,然后打开 Reference.cs(假设它是用 C# 生成的)文件,您将在文件中看到这个头文件:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3053
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

现在,使用 svcutil 命令行生成代理代码。打开生成的文件,您将看到完全相同的标题。

此外,当您在添加服务引用时查看 Visual Studio 2008 中的可用选项时,每个选项都对应一个 svcutil 参数。

于 2009-01-04T21:23:27.590 回答