是否可以从VS2010插件刷新WCF服务引用?

时间:2011-01-11 16:27:22

标签: wcf visual-studio-2010 add-in vsx

我想在VS2010插件中“模拟”右键单击/更新服务引用命令。我有一个包含(Silverlight ...)项目的引用,我知道服务引用的名称和服务的URL。
我发现了这个:http://dedjo.blogspot.com/2007/03/adding-web-references-to-your-vs.html,但它只适用于asmx(它使用System.Web.Services而不是System.ServiceModel),而不是wcf。 是否有任何选择从代码中调用svcutil?如果是这样,怎么样? (我是否使用svcutil或slsvcutil?如何从插件内部调用它?)
谢谢

2 个答案:

答案 0 :(得分:8)

我相信visual studio命令是“Project.UpdateServiceReference”。所以我猜你可以尝试选择你感兴趣的节点,并运行这个命令,如下所示:

envDTE.Windows.Item(vsWindowKindSolutionExplorer).Activate();
envDTE.ActiveWindow.Object.GetItem(@"MyProject\Service References\Proxy").Select(vsUISelectionType.vsUISelectionTypeSelect);
envDTE.ExecuteCommand("Project.UpdateServiceReference");

答案 1 :(得分:2)

如果您正在寻找更具编程性的方法,您可以执行以下操作。这种方法不需要使用DTE自动化层,它将改变用户的选择并执行命令。请注意,这是在具有IServiceProvider的VSPackage的上下文中,以便它可以将实例提供给核心Visual Studio接口等...

您也可以在Addin中执行此操作,但you'd need to get an IServiceProvider并添加对(至少)Microsoft.VisualStudio.Shell.Interop.dll和Microsoft.VisualStudio.WCFReference.Interop的引用。 Visual Studio 2010 SDK中提供了这些二进制文件的参考程序集。

IVsSolution solution = GetService(typeof(SVsSolution)) as IVsSolution;
if (solution != null)
{
    IVsHierarchy solutionHierarchy = solution as IVsHierarchy;
    if (null != solutionHierarchy)
    {
        IEnumHierarchies enumHierarchies;
        Guid nullGuid = Guid.Empty;

        ErrorHandler.ThrowOnFailure(solution.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_ALLINSOLUTION, ref nullGuid, out enumHierarchies));
        if (enumHierarchies != null)
        {
            uint fetched;
            IVsHierarchy[] hierarchies = new IVsHierarchy[1];
            IVsWCFReferenceManagerFactory wcfReferenceManagerFactory = GetService(typeof(SVsWCFReferenceManagerFactory)) as IVsWCFReferenceManagerFactory;
            if (wcfReferenceManagerFactory != null)
            {
                while (enumHierarchies.Next(1, hierarchies, out fetched) == 0 && fetched == 1)
                {
                    if (wcfReferenceManagerFactory.IsReferenceManagerSupported(hierarchies[0]) == 1)
                    {
                        IVsWCFReferenceManager referenceManager = wcfReferenceManagerFactory.GetReferenceManager(hierarchies[0]);
                        var referenceGroupCollection = referenceManager.GetReferenceGroupCollection();
                        referenceGroupCollection.UpdateAll(null);
                    }
                }
            }
        }
    }
}

我还建议您查看Visual Studio 2010 SDK的WCF Service Consumption Tools samples