Как определить, нужно ли добавлять элементы проекта с помощью IWizard? - PullRequest
3 голосов
/ 14 июня 2010

Я создаю оболочки объектов в 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 Ответ

5 голосов
/ 15 июня 2010

AutomaticObject в методе RunStarted представляет среду или контекст 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.
            }
        }
    }
}
...