0

私は書いていvisual studio packageます、私の要件は、ユーザーが作成する必要があるということですempty visual studio project C++ or C#private void MenuItemCallback(object sender, EventArgs e)動的に生成されたファイルをプロジェクトに追加できるように、このプロジェクトにアクセスするにはどうすればよいですか。

これは私が今までやってきたことです

private void MenuItemCallback(object sender, EventArgs e)
{
        IVsSolution solutionService = GetService(typeof(SVsSolution)) as IVsSolution;
        // get all projects in solution
         IEnumHierarchies enumHierarchies = null;
         Guid guid = Guid.Empty;
                ErrorHandler.ThrowOnFailure(solutionService.GetProjectEnum(     (uint)__VSENUMPROJFLAGS.EPF_ALLINSOLUTION,ref guid,out enumHierarchies));
                //Loop all projects found
                if (enumHierarchies != null)
                {
                    // Loop projects found
                    IVsHierarchy[] hierarchy = new IVsHierarchy[1];
                    uint fetched = 0;

                    while (enumHierarchies.Next(1, hierarchy, out fetched) == VSConstants.S_OK && fetched == 1)                {                   
                        Guid projectGuid;
                        ErrorHandler.ThrowOnFailure(hierarchy[0].GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out projectGuid));
                    }
                }            
            }
4

1 に答える 1

0

共有 DLL プロジェクトと実行可能プロジェクトを作成し、必要なすべての参照と、必要な初期化コードを含むファイルを追加します。ユーザーの指示に注意する必要があるため、プロジェクトをテンプレートとしてエクスポートすることはまだできません。

ユーザーの入力またはプロジェクトの名前に依存する特定の文字列がある場合は、それらの名前を $ で囲んでパラメーターとして識別する必要があります (テンプレート用の標準パラメーターもいくつかあります)。たとえば、次のようなものがあります。

public class $aclassname$ : YourBaseClass

ウィザードを使用してユーザーを取得するには、Microsoft.VisualStudio.TemplateWizard.IWizard、特に次のメソッドを実装するクラスで別のプロジェクトを作成する必要があります。

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)

このメソッド内で、独自のウィザードを開き、ユーザーからの入力に従って動作させることができます。特に、次のように、replacementsDictionary に項目を追加して、テンプレートに入力したパラメーターを置き換えることができます。

replacementsDictionary.Add("$aclassname$", aVarFromYourWizard);

さらに、automationobject は、VisualStudio インスタンスを指す EnvDTE.DTEClass のインスタンスです。これは、それを DTEClass にキャストし、それを使用して作成中のプロジェクトを取得し、必要に応じて変更できることを意味します。

このウィザード プロジェクトを終了したら、まずこのウィザード アセンブリに署名するために持っているテンプレートを使用するために、テンプレート プロジェクトに戻ってエクスポートできます ([ファイル] -> [テンプレートを VSIX としてエクスポート])。ウィザード アセンブリ。

herehereもご覧ください。

編集:

IWizard には、テンプレート内のファイルを実際のプロジェクトに追加する必要があるかどうかを指定できる方法があることを付け加えるのを忘れていました。ウィザードからのデータを使用して、何をすべきかを決定できます。それは:

public bool ShouldAddProjectItem(string filePath)

この方法は、アドインを開発するよりもはるかに簡単で保守しやすいと思います。

于 2012-05-28T06:27:09.053 に答える