2011-01-11 100 views
10

我想「模擬」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?我怎麼把它從裏面插件?)
感謝是否可以從VS2010插件中刷新WCF服務引用?

+0

noone?請,這是我的班級插件缺少的最後一件... – TDaver 2011-01-17 12:41:42

回答

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"); 
+0

OMG,謝謝!我會在星期一嘗試第一件事,看看它是否有效! (獎勵你50 ...),但有一件事:我可以刷新服務沒有在解決方案資源管理器中選擇它? – TDaver 2011-02-26 14:39:51

+0

好的,我得到了這個工作,因爲我沒有指定選擇無法改變我寧願寫一個簡單的解決方法,所以我可以使用這個,更簡單的方法! :) – TDaver 2011-02-28 11:13:40

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); 
        } 
       } 
      } 
     } 
    } 
} 

我也建議看WCF Service Consumption Tools samples爲Visual Studio 2010的SDK。

相關問題