Example: click here.
It is a Draft document In the previous month I should create a Wizard that it generates a solution with 3 complex projects. The first thinks is use the IWizard interface of Visual Studio. It works fine with a single project template but when you create a MultiProject template this mechanism doesn’t work! For exactly the replacement mechanism that is embedded in Visual Studio don’t propagates the repalcementsDictionary to the other template. I have resolved this problem in the follow way: I have added in each template a WizardExtenstion and a WizardData. In this way for each template is called my IWizard implementation and with static members a communicate between IWizard instances. In each call of RunStart I add in the repalcementsDictionary the correct value (for example projectname and all custom template parameters) for the current template
At this link you can download an example of solution click here.
Installing the example
In the example you can find a folder called “Template” and “IWizardImpl”, in the first folder you find the template that should be decompressed in <User>/Visual Studio 2008/Templates/ProjectTemplates/Visual C#/ (the same thing with VS2005 but the folder is Visual Studio 2005 not Visual Studio 2008) folder.
After that you must register in the GAC the IWizardImpl.dll assembly. This example came with a Debug version placed in IWizardImpl\bin\Debug folder.
You should call the “gacutil.exe” application from the Visual Studio command line or providing full path (for example” C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe”) with the /I param and passing the dll that you won’t store in the GAC.
gacutil.exe /i IWizardImpl.dll
For more detail you can found information about this steps on the MSDN about Visual Studio IWizard.
Example structure of template
The template folder contains a MutiProject template this template refers other two templates . Each templates call the same Wizard but each call has a different custom parameter.
This custom parameter is defined in the WizardData tag, an example is the follow portion of template file of UserControl/MyTemplate.vstemplate.
<WizardData Name="ProjectPart">UserControl</WizardData>
This tag at runtime means that in the replacementDictionary an element with key “ProjectPart” and value “UserControl” is added and you can read this value.
Summering the steps
-
Understands if the calling template is a MultiProject or a Project with WizardRunKind enumeration
- If it is a MultiProject, shows my wizard and collect some information and stores it in statics members.
- If a Project I read the custom parameter to understand if I working over the Skins or UserControl. Go to step 2
- Populates the replacementDictionary with my customization and replacing for example the projectname with an appropriate value.
This steps are useful for avoiding the problem of no replacing mechanism don’t work properly in the case of MultiProject template.