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 是 EnvDTE.DTEClass 的一个实例,指向您的 VisualStudio 实例。这意味着您可以将其转换为 DTEClass,然后使用它来获取您正在创建的项目并根据您的需要对其进行修改。

完成此向导项目后,为了使用您的模板,您首先要签署此向导程序集,然后您可以返回您的模板项目以导出它们(文件 -> 将模板导出为 VSIX)小心指定您的巫师大会。

你也可以看看这里这里

编辑:

我忘了补充一点,IWizard 有一个方法可以让您指定是否必须将模板中的文件添加到您的实际项目中。您显然可以使用向导中的数据来决定要做什么。这是:

public bool ShouldAddProjectItem(string filePath)

我认为这种方式比开发 AddIn 更容易和可维护。

于 2012-05-28T06:27:09.053 回答