Можно ли обновить ссылку на службу WCF из надстройки VS2010? - PullRequest
10 голосов
/ 11 января 2011

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

8 голосов
/ 26 февраля 2011

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

envDTE.Windows.Item(vsWindowKindSolutionExplorer).Activate();
envDTE.ActiveWindow.Object.GetItem(@"MyProject\Service References\Proxy").Select(vsUISelectionType.vsUISelectionTypeSelect);
envDTE.ExecuteCommand("Project.UpdateServiceReference");
2 голосов
/ 26 февраля 2011

Если вы ищете более программный способ сделать это, вы можете сделать что-то вроде следующего.Этот подход не требует использования уровня автоматизации 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.

...