是否可以从VS2010加载项刷新WCF服务引用?

是否可以从VS2010加载项刷新WCF服务引用?,wcf,visual-studio-2010,add-in,vsx,Wcf,Visual Studio 2010,Add In,Vsx,我想在VS2010加载项中“模拟”右键单击/更新服务引用命令。我有一个包含(Silverlight…)项目的引用,我知道服务引用的名称和服务的url。 我发现:,但它只适用于asmx(它使用System.Web.Services而不是System.ServiceModel),而不适用于wcf。 除了从代码调用svcutil之外,还有其他选择吗?如果是,怎么做?(我是使用svcutil还是slsvcutil?如何从加载项内部调用它? 谢谢我相信visual studio的命令是“Project.U

我想在VS2010加载项中“模拟”右键单击/更新服务引用命令。我有一个包含(Silverlight…)项目的引用,我知道服务引用的名称和服务的url。
我发现:,但它只适用于asmx(它使用System.Web.Services而不是System.ServiceModel),而不适用于wcf。 除了从代码调用svcutil之外,还有其他选择吗?如果是,怎么做?(我是使用svcutil还是slsvcutil?如何从加载项内部调用它?

谢谢

我相信visual studio的命令是“
Project.UpdateServiceReference
”。因此,我想您可以尝试选择感兴趣的节点,然后运行以下命令,如下所示:

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

如果您正在寻找更具编程性的方法来实现这一点,您可以执行以下操作。这种方法不需要使用DTE自动化层,DTE自动化层将更改用户的选择并执行命令。请注意,这是在带有IServiceProvider的VSPackage的上下文中进行的,因此它可以获取到核心Visual Studio接口的实例,等等

您也可以在外接程序中执行此操作,但需要添加对(至少)Microsoft.VisualStudio.Shell.Interop.dll和Microsoft.VisualStudio.WCFReference.Interop的引用。中提供了这些二进制文件的参考程序集


我还建议您查看Visual Studio 2010 SDK的详细信息。

noone?求求你,这是我这一代人的最后一件作品了,艾丁……天哪,谢谢!我会在周一的第一件事就是尝试一下,看看它是否有效!(为了奖励您50…,但有一件事:我可以在不在解决方案资源管理器中选择服务的情况下刷新服务吗?好的,我让这一个正常工作了,因为我没有指定选择不能更改,所以我编写了一个简单的解决方法,以便我可以使用这个更简单的方法!)什么类有GetService方法?我已经阅读了您发送的链接,但我不知道如何从DTE获取IServiceProvider…我尝试将DTE强制转换为IServiceProvider(使用强制转换运算符,因为使用“as”返回null),我已
无法将类型为“System.”的COM对象强制转换为接口类型“System.IServiceProvider”。此操作失败,因为对IID为“{8F10F540-7F5D-3F37-8D79-1E0AEB074AA0}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。
OK,已设法获取IServiceProvider(请参阅),while循环被调用四次,然后抛出异常(
操作由于对象的当前状态无效。
)-这很奇怪,因为我在整个解决方案中只有一个服务引用!
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);
                    }
                }
            }
        }
    }
}