如何使用IWizard确定是否添加项目项?

时间:2010-06-14 12:20:56

标签: c# visual-studio-2010 wizard

我在VS2010中基于CRM系统中的动态对象生成实体包装器。除了实体代码之外,我还想添加一个EntityBase,所有实体都从中继承。如果该文件之前存在于该项目中,则不应添加该文件。我正在使用IWizard实现为生成器提供对象名称等。

在IWizard实现中是否可以确定是否添加项目(如果项目之前存在)?如何在ShouldAddProjectItem方法中或之前保留项目句柄及其项目?

到目前为止我的代码(未完成):

public class EntityWizardImplementation : IWizard
{
    public void BeforeOpeningFile(ProjectItem projectItem)
    {
        //Note: Nothing here.
    }

    public void ProjectFinishedGenerating(Project project)
    {
        //Note: Nothing here.
    }

    public void ProjectItemFinishedGenerating(ProjectItem projectItem)
    {
        //Note: Nothing here.
    }

    public void RunFinished()
    {
        //Note: Nothing here.
    }

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
       try
        {
            var window = new WizardWindow();

            // Replace parameters gathered from the wizard
            replacementsDictionary.Add("$crmEntity$", window.CrmEntity);
            replacementsDictionary.Add("$crmOrganization$", window.CrmOrganization);
            replacementsDictionary.Add("$crmMetadataServiceUrl$", window.CrmMetadataUrl);

            window.Close();
        }
        catch (SoapException se)
        {
            MessageBox.Show(se.ToString());
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

    public bool ShouldAddProjectItem(string filePath)
    {
        // This is where I assume it is correct to handle the preexisting file.
        return true;
    }
}

1 个答案:

答案 0 :(得分:5)

RunStarted方法中的automationObject表示Visual Studio环境或上下文。它可以转换为DTE对象,您可以从对象访问解决方案,项目等。如果您将其作为项目模板或项目模板向导启动而不是以编程方式启动,则为真。在这种情况下,访问对象很可能会失败。

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
    if (automationObject is DTE)
    {
        DTE dte = (DTE)automationObject;
        Array activeProjects = (Array)dte.ActiveSolutionProjects;

        if (activeProjects.Length > 0)
        {
            Project activeProj = (Project)activeProjects.GetValue(0);

            foreach (ProjectItem pi in activeProj.ProjectItems)
            {
                // Do something for the project items like filename checks etc.
            }
        }
    }
}