2011-01-11 17 views
10

VS2010アドインの右クリック/アップデートサービス参照コマンドを「シミュレート」します。私は含まれている(Silverlight ...)プロジェクトへの参照を持っています、私はサービス参照の名前とサービスのURLを知っています。
これは、http://dedjo.blogspot.com/2007/03/adding-web-references-to-your-vs.htmlですが、asmx(System.ServiceModelの代わりにSystem.Web.Servicesを使用)では動作し、wcfでは動作しません。 選択がありますしかしコードからsvcutilを呼び出しますか?もしそうなら、どうですか? (私は、アドインの中からそれを呼び出す方法を教えてください。svcutil使用するか、slsvcutilていますか?)
おかげVS2010アドインからWCFサービス参照を更新することは可能ですか?

+0

noone?してください、これは私のクラス世代のアドインから欠けている最後の作品です... – TDaver

答えて

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を授与する...)、1つのこと:ソリューションエクスプローラでサービスを選択せず​​にサービスを更新できますか? – TDaver

+0

さて、私はこれを動作させました。選択が変更できないと指定していないので、私は簡単な回避策を書いたので、この簡単なアプローチを使用できます! :) – TDaver

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

Visual Studio 2010 SDKの場合は、WCF Service Consumption Tools samplesをご覧ください。

+0

ありがとう、私もこれを試してみましょう! – TDaver

+0

どのようなクラスにGetServiceメソッドがありますか?あなたが送信したリンクを読みましたが、DTEからIServiceProviderを取得する方法を理解できません... – TDaver

+0

DTEをIServiceProviderにキャストしようとしました。タイプ 'System .__ ComObject'のCOMオブジェクトをインターフェイスタイプ 'System.IServiceProvider'にキャストすることができません。次のエラーが原因でIID '{8F10F540-7F5D-3F37-8D79-1E0AEB074AA0}'のインターフェイスのCOMコンポーネントのQueryInterface呼び出しが失敗したため、この操作は失敗しました:このようなインターフェイスはサポートされていません(HRESULT:0x80004002(E_NOINTERFACE)例外) 。 – TDaver

関連する問題