2011-12-07 30 views
1

テンプレートで生成された新しいソリューションに既存のプロジェクトを追加したいと思います。 vstemplateファイルでこれを達成できますか、IWizardを使用する必要がありますか? IWizardを使用する必要がある場合は、どうすれば正しく動作させることができますか?現在、私は次のことを試してみました:カスタムwizarddataでいくつかのソリューションフォルダと一つのプロジェクト テンプレートウィザードを使用してビジュアルスタジオプロジェクトに既存のプロジェクトを追加する方法

  • ウィザードが追加されます

    1. マルチテンプレートを。 $ wizarddata $には、既にハードドライブ上に存在するプロジェクトへの相対パスが含まれています。ウィザードでは、これらのプロジェクトのベースパスを選択します。このプロジェクトを私のソリューションに今追加するにはどうすればいいですか?

      var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0"); 
      var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type); 
      var solution = (EnvDTE100.Solution4)dte2.Solution; 
      var projects = dte2.ActiveSolutionProjects; 
      

      プロジェクトは、任意のプロジェクトが含まれていません:

    主な問題は、ソリューションオブジェクトが何も含まれていないことのようです。同じことがdte2.Solution.Projectsにも適用されます。このコードは、IWizard実装のRunFinished関数で呼び出されます。または:

    var type = Type.GetTypeFromProgID("VisualStudio.DTE.10.0"); 
    var dte2 = (EnvDTE80.DTE2)Activator.CreateInstance(type); 
    dte2.ExecuteCommand("File.AddExistingProject", "X:\\Path\\To\\Project\\ProjectName.csproj"); 
    

    はCOM例外をスローします。ビジュアルスタジオのマクロからExecuteCommandを実行すると正常に動作します。私は間違って何をしていますか?

  • 答えて

    1

    いいえ問題が見つかりました。上記のコードスニペットは、DTE-Objectの作成で正しく機能しません。 RunStarted関数からautomationObjectを覚えて、RunFinished関数で使用すると、すべてが正常に機能します。

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) 
    { 
        // ... 
        dte = automationObject as DTE; 
    } 
    
    public void RunFinished() 
    { 
        // ... 
        // projects will automatically added relative 
        dte.ExecuteCommand("File.AddExistingProject", "\""+path+"\""); 
    } 
    
    +0

    また、このアプローチを使用してサーバーエクスプローラの接続マネージャーを取得しました。このコードを使用しました:DTEとしてのvar dte = automationObject; Microsoft.VisualStudio.Shell.ServiceProvider sp = new Microsoft.VisualStudio.Shell.ServiceProvider((IOleServiceProvider)dte); IVsDataExplorerConnectionManager seConnectionsMgr =(IVsDataExplorerConnectionManager)sp.GetService(typeof(IVsDataExplorerConnectionManager).GUID);うまくいけば、これは他の人に時間を節約します。 – gab

    関連する問題