2

テンプレートによって生成された新しいソリューションに既存のプロジェクトを追加したいと思います。vstemplateファイルを介してこれを達成できますか、それともIWizardを使用する必要がありますか?また、IWizardを使用する必要がある場合、どうすれば正しく操作できますか。現在、私は以下を試しました:

  1. いくつかのソリューションフォルダと1つのプロジェクトを追加するマルチプロジェクトテンプレート
  2. カスタムwizarddataを使用したウィザード。$ widgetdata $には、ハードドライブにすでに存在するプロジェクトへの相対パスがいくつか含まれています。ウィザードで、これらのプロジェクトのベースパスを選択します。このプロジェクトを今すぐソリューションに追加するにはどうすればよいですか?

主な問題は、Solutionオブジェクトに何も含まれていないことのようです。

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例外をスローします。Visual StudioのマクロからExecuteCommandを実行すると、正常に動作します。私は何が間違っているのですか?

4

1 に答える 1

2

問題が見つかりました。DTE オブジェクトの作成に関する上記のコード スニペットは正しく機能しません。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+"\"");
}
于 2011-12-08T09:08:01.047 に答える