【问题标题】:How can I determine whether or not to add project items using IWizard?如何确定是否使用 IWizard 添加项目项?
【发布时间】:2010-06-14 12:20:56
【问题描述】:

我在 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;
    }
}

【问题讨论】:

    标签: c# visual-studio-2010 wizard


    【解决方案1】:

    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.
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多