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