Возможно ли обновить ссылку службы WCF из VS2010 addin?

Я хочу "имитировать" ссылку на ссылку правой кнопки мыши/Обновить службу в добавлении 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? Как мне его вызвать изнутри?) спасибо

Ответ 1

Я считаю, что команда visual studio для этого - "Project.UpdateServiceReference". Поэтому, я думаю, вы можете попробовать выбрать node, который вам интересен, и запустить эту команду следующим образом:

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

Ответ 2

Если вы ищете более программный способ сделать это, вы можете сделать что-то вроде следующего. Этот подход не требует использования уровня автоматизации DTE, который изменит выбор пользователя и выполнит команду. Обратите внимание, что это относится к контексту VSPackage с IServiceProvider, чтобы он мог получить экземпляры для основных интерфейсов Visual Studio и т.д.

Вы также можете сделать это изнутри Addin, но вам нужно получить 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);
                    }
                }
            }
        }
    }
}

Я также рекомендую посмотреть образцы инструмента потребления WCF для для Visual Studio 2010 SDK.