Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Multi-Project Template - Replace Parameters

124 views
Skip to first unread message

Mythran

unread,
Sep 26, 2008, 4:45:32 PM9/26/08
to
I'm trying to create a multi-project template. On the New Project dialog,
the user would select this template and enter a name in the Name box (as if
they were creating a regular project). My multi-project vstemplate file
contains the following:

<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>MCIS Web Solution Template</Name>
<Description>MCIS Standard Web Solution Template</Description>
<Icon>__TemplateIcon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>

<!-- Template Content -->
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ReplaceParameters="true"
ProjectName="Schema">Source\Schema\Schema.vstemplate</ProjectTemplateLink>
</ProjectCollection>
<CustomParameters>
<CustomParameter Name="$solutionname$"
Value="MCIS.Applications.$safeprojectname$" />
</CustomParameters>
</TemplateContent>
</VSTemplate>

How would I go about passing the $solutionname$ parameter to the Schema
template so the Schema.vbproj file can set the root namespace and assembly
name to MCIS.Applications.<solution name here>.Schema? I'm kinda stuck. In
my Schema.vstemplate file, I can set custom parameters, but I don't know how
to create a custom parameter that has the name of the multi-project solution
as the value of the parameter....the following is my Schema.vstemplate that
does not work:


<VSTemplate Version="2.0.0" Type="Project"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<!-- Template Information -->
<TemplateData>
<Name>Schema</Name>
<Description>MCIS Schema Project Template</Description>
<Icon>__TemplateIcon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
<CreateNewFolder>true</CreateNewFolder>
<ProvideDefaultName>true</ProvideDefaultName>
<DefaultName>Schema</DefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
</TemplateData>

<!-- Template Contents -->
<TemplateContent>
<Project File="Schema.vbproj" ReplaceParameters="true"
TargetFileName="Source\Schema\Schema.vbproj">
<Folder Name="classes">
<Folder Name="searchcriteria" />
</Folder>
<Folder Name="datasets" />
<Folder Name="My Project">
<ProjectItem
ReplaceParameters="true">Application.myapp</ProjectItem>
<ProjectItem
ReplaceParameters="true">Application.Designer.vb</ProjectItem>
<ProjectItem
ReplaceParameters="true">AssemblyInfo.vb</ProjectItem>
<ProjectItem
ReplaceParameters="true">Settings.settings</ProjectItem>
<ProjectItem
ReplaceParameters="true">Settings.Designer.vb</ProjectItem>
</Folder>
</Project>
<CustomParameters>
<CustomParameter Name="$mcisnamespace$"
Value="$solutionname$.Schema" />
</CustomParameters>
</TemplateContent>
</VSTemplate>

In my Schema.vbproj I have:
<Project .. >
<PropertyGroup>
...
<RootNamespace>$mcisnamespace$</RootNamespace>
...
</PropertyGroup>
...
</Project>

Thanks,
Mythran

Hongye Sun [MSFT]

unread,
Sep 29, 2008, 4:22:58 AM9/29/08
to
Hi Mythran,

Thank you for posting here!

I notice that you have posted the same question in our
microsoft.public.vstudio.extensibility newsgroup, which I have already
responded. So please check my answer there and if you need any further
assistance on this particular issue, please reply to me in that thread so
that I can follow up with you in time.

Please go to
http://www.microsoft.com/communities/newsgroups/en-us/?dg=microsoft.public.v
studio.extensibility&mid=bb27115d-2a8b-4131-bb3e-1c74b3b13688 to view my
reply.

For your convenience, I have included my reply as following:

---------------------
Do you mean that you want to pass the project name filled by the user when
creating a new project by multiple project template to its sub-project
template as a parameter? So that the sub-project name can contain the user
input project name. Please correct me if I am wrong.

As far as I know, custom parameters will not inherit from root template to
its sub-project templates. However, some default parameters can be passed
to its sub-project templates.
In root template file, we use <ProjectTemplateLink> element to include
sub-project template. Its attribute "ProjectName" will be considered as
default parameters "$projectname$" and "$safeprojectname$" in sub-project
templates. We could also use parameters to specify the "ProjectName"
attribute no matter we set "ReplaceParameters" attribute or not. (Note that
there is no "ReplaceParameters" attribute in <ProjectTemplateLink> element
schema.)

Now we could do like this:
1. Define a custom parameter named "$solutionname$" with value
"MCIS.Applications.$safeprojectname$".
2. Specify the attribute "ProjectName" as "$solutionname$.Schema" in
<ProjectTemlateLink> element.
3. In the Schema.vbproj file, using "$projectname$" or "$safeprojectname$"
to specify its <RootNamespace> element.

Here is the vstemplate files after change:

Root vstemplate file:
-------------------------------------------------------


<VSTemplate Version="2.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>MCIS Web Solution Template</Name>
<Description>MCIS Standard Web Solution Template</Description>
<Icon>__TemplateIcon.ico</Icon>
<ProjectType>VisualBasic</ProjectType>
</TemplateData>

<!-- Template Content -->
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink

ProjectName=""$solutionname$.Schema">Source\Schema\Schema.vstemplate</Projec


tTemplateLink>
</ProjectCollection>
<CustomParameters>
<CustomParameter Name="$solutionname$"
Value="MCIS.Applications.$safeprojectname$" />
</CustomParameters>
</TemplateContent>
</VSTemplate>

-------------------------------------------------------

Schema.vstemplate
-------------------------------------------------------

</TemplateContent>
</VSTemplate>
-------------------------------------------------------

Schema.vbproj
-------------------------------------------------------
<Project .. >
<PropertyGroup>
...
<RootNamespace>$safeprojectname$</RootNamespace>
...
</PropertyGroup>
...
</Project>

-------------------------------------------------------

---------------------

Thank you and have a nice day!

Regards,
Hongye Sun (hon...@online.microsoft.com, remove 'online.')
Microsoft Online Community Support

Delighting our customers is our #1 priority. We welcome your comments and
suggestions about how we can improve the support we provide to you. Please
feel free to let my manager know what you think of the level of service
provided. You can send feedback directly to my manager at:
msd...@microsoft.com.

==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://support.microsoft.com/select/default.aspx?target=assistance&ln=en-us.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.

Egan@discussions.microsoft.com Bob Egan

unread,
Oct 20, 2008, 6:37:01 AM10/20/08
to
Parameters can be passed among sub projects using a wizard. Here's how I do it:

You have several projects in the zip file for that template. Each has its
own vstemplate file in addition to the master vstemplate.

1. Write a wizard (class library that implements IWizard). Here's the trick:
ALL VARIABLES THAT YOU WANT TO PASS AMONG PROJECTS MUST BE STATIC:

private static string namespace;

2. Add a form to accept input from the user.
3. Only show the form for the multi-project template:

public void RunStarted(object automationObject,
Dictionary<string, string> replacementsDictionary,
WizardRunKind runKind, object[] customParams)
{
if (runKind == WizardRunKind.AsMultiProject)
{
//show your form and handle the user input
}
}

4. Build the wizard with a strongly named key, and add to your GAC
5. Edit ALL vstemplate files to include the WizardExtension tag pointing to
your wizard.

That's all you need to do.

Hope this helps you.


Mythran

unread,
Oct 31, 2008, 11:26:59 AM10/31/08
to

"Bob Egan" <Bob Eg...@discussions.microsoft.com> wrote in message
news:E0D237ED-83EE-49AA...@microsoft.com...

This is what I ended up doing. Sorry it took me so long to reply (and the
original message may or may not still be on the server)...there were quite a
few issues with templates in Visual Studio 2008 that I had to use
workarounds for (modifying the sub-directory the projects get placed into
... had to implement IDTWizard and use VSZ files for the projects so I had a
Wizard and template wizard for the projects).

Thanks :)

Mythran

Kisalay Das

unread,
Jan 12, 2012, 6:55:02 AM1/12/12
to
With pretty much similar requirement, I followed exactly your said steps, but still I'm not able to get it done. I mean, get sub projects replaced with parameter value when I am creating 2 projects from a template. Can I debug ? How ?

Thans in advance.

> On Friday, September 26, 2008 4:45 PM Mythran wrote:

> I'm trying to create a multi-project template. On the New Project dialog,
> the user would select this template and enter a name in the Name box (as if
> they were creating a regular project). My multi-project vstemplate file
> contains the following:
>
> <VSTemplate Version="2.0.0" Type="ProjectGroup"
> xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
> <TemplateData>
> <Name>MCIS Web Solution Template</Name>
> <Description>MCIS Standard Web Solution Template</Description>
> <Icon>__TemplateIcon.ico</Icon>
> <ProjectType>VisualBasic</ProjectType>
> </TemplateData>
>
> <!-- Template Content -->
> <TemplateContent>
> <ProjectCollection>
> <ProjectTemplateLink ReplaceParameters="true"
> ProjectName="Schema">Source\Schema\Schema.vstemplate</ProjectTemplateLink>
> </ProjectCollection>
> <CustomParameters>
> <CustomParameter Name="$solutionname$"
> Value="MCIS.Applications.$safeprojectname$" />
> </CustomParameters>
> </TemplateContent>
> </VSTemplate>
>
> How would I go about passing the $solutionname$ parameter to the Schema
> template so the Schema.vbproj file can set the root namespace and assembly
> name to MCIS.Applications.<solution name here>.Schema? I'm kinda stuck. In
> my Schema.vstemplate file, I can set custom parameters, but I don't know how
> to create a custom parameter that has the name of the multi-project solution
> as the value of the parameter....the following is my Schema.vstemplate that
> does not work:
>
>
> <CustomParameters>
> <CustomParameter Name="$mcisnamespace$"
> Value="$solutionname$.Schema" />
> </CustomParameters>
> </TemplateContent>
> </VSTemplate>
>
> In my Schema.vbproj I have:
> <Project .. >
> <PropertyGroup>
> ...
> <RootNamespace>$mcisnamespace$</RootNamespace>
> ...
> </PropertyGroup>
> ...
> </Project>
>
> Thanks,
> Mythran


>> On Monday, September 29, 2008 4:13 AM hongye wrote:

>> Hello Mythran,
>>
>> Welcome to Microsoft Newsgroup Service. My name is Hongye Sun [MSFT]. It is
>> my pleasure to work with you on this issue.
>> Please try the solution above and let me know if you have any question on
>> it. Thanks.
>>
>> Regards,
>> Hongye Sun (hon...@online.microsoft.com, remove 'online.')
>> Microsoft Online Community Support
>>
>> Delighting our customers is our #1 priority. We welcome your comments and
>> suggestions about how we can improve the support we provide to you. Please
>> feel free to let my manager know what you think of the level of service
>> provided. You can send feedback directly to my manager at:
>> msd...@microsoft.com.
>>
>> ==================================================
>> Get notification to my posts through email? Please refer to
>> http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.
>>
>> Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
>> where an initial response from the community or a Microsoft Support
>> Engineer within 1 business day is acceptable. Please note that each follow
>> up response may take approximately 2 business days as the support
>> professional working with you may need further investigation to reach the
>> most efficient resolution. The offering is not appropriate for situations
>> that require urgent, real-time or phone-based interactions or complex
>> project analysis and dump analysis issues. Issues of this nature are best
>> handled working with a dedicated Microsoft Support Engineer by contacting
>> Microsoft Customer Support Services (CSS) at
>> http://support.microsoft.com/select/default.aspx?target=assistance&ln=en-us.
>> ==================================================
>> This posting is provided "AS IS" with no warranties, and confers no rights.


>>>> On Wednesday, October 01, 2008 12:32 PM Mythran wrote:

>>>> I went ahead and wrote a wizard so now the templates (when using the wizard)
>>>> inherit custom parameters (so a multi-project template can set parameters
>>>> and the project templates receive these custom parameters as part of their
>>>> custom parameters and the project items also see these parameters in their
>>>> custom parameter list). The problem I'm confronted with now is changing the
>>>> default project location....
>>>>
>>>> When creating a solution from multi-project template, there is no way to
>>>> change the solution's name nor specify where the projects from the
>>>> multi-project location are to be placed. They have a tendancy to be placed
>>>> 1 folder deeper than where the solution file is stored and the parent
>>>> folder's name is always the name of the solution; so for a multi-project
>>>> template when the user enters a Project name of Solution1 the following
>>>> structure is the folder structure automatically generated:
>>>>
>>>> C:\SolutionFolder\Solution1.sln
>>>> C:\SolutionFolder\Solution1\Project1\Project1.vbproj
>>>> C:\SolutionFolder\Solution1\Project2\Project2.vbproj
>>>> C:\SolutionFolder\Solution1\Project3\Project3.vbproj
>>>>
>>>> Using only templates if I can, otherwise through the class I wrote that
>>>> implements the IWizard interface, I would like to be able to change the
>>>> solution's name and the project directories location prior to the projects
>>>> being added to the solution....so the generated structure is:
>>>>
>>>> C:\SolutionFolder\MCIS.Applications.Solution1.sln
>>>> C:\SolutionFolder\Source\Project1\Project1.vbproj
>>>> C:\SolutionFolder\Source\Project2\Project2.vbproj
>>>> C:\SolutionFolder\Source\Project3\Project3.vbproj
>>>>
>>>> This is the recommended structure for Team Foundation Server projects yet
>>>> the default project settings don't really allow you to create the solutions
>>>> and projects in this manner. You have to manually move the created solution
>>>> project, rename it, move each project folder, and then edit the solution in
>>>> a text editor to point to the project files in the new location. This is
>>>> kinda strange since the recommended practices from Microsoft defy the
>>>> ability of the new solution/project wizards.
>>>>
>>>> Thanks,
>>>> Mythran


>>>>> On Wednesday, October 08, 2008 5:46 AM stchen wrote:

>>>>> Hi Mythran,
>>>>>
>>>>> As Hongye has been OOF this two days, I'll help him to assist you on this
>>>>> issue. For the issue, Hongye has been discussing on it with me and I've got
>>>>> that you've currently got some progress via creating a custom project
>>>>> wizard which internally call some built-in wizard interface. And there is
>>>>> one path(which indicate the place VS IDE extract the project template zip
>>>>> package) parameter you can quite get in your custom wizard, correct?
>>>>>
>>>>> As for this zip extracting cache location, we have performed some research
>>>>> and consulted some other engineers, I'm afraid this parameter is somewhat
>>>>> hidden by the VS IDE and is also undocumented by the product. In order to
>>>>> make the approach work, so far Hongye and I have thought about one
>>>>> potential workaround, that is use a custom path for that parameter(instead
>>>>> of the build-in location the visual studio extract the template zip).
>>>>> Therefore, we need to extract the template zip file into a custom location
>>>>> in our own code and supply that location to the wizard interface. How do
>>>>> you think of this?
>>>>>
>>>>> Sincerely,
>>>>>
>>>>> Steven Cheng
>>>>>
>>>>> Microsoft MSDN Online Support Lead
>>>>>
>>>>>
>>>>> Delighting our customers is our #1 priority. We welcome your comments and
>>>>> suggestions about how we can improve the support we provide to you. Please
>>>>> feel free to let my manager know what you think of the level of service
>>>>> provided. You can send feedback directly to my manager at:
>>>>> msd...@microsoft.com.
>>>>>
>>>>> ==================================================
>>>>> Get notification to my posts through email? Please refer to
>>>>> http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.
>>>>> ==================================================
>>>>> This posting is provided "AS IS" with no warranties, and confers no rights.
>>>>>
>>>>> --------------------
>>>>> <xOTvWtgI...@TK2MSFTNGHUB02.phx.gbl>
>>>>>
>>>>> wizard)
>>>>> the
>>>>> placed
>>>>>>> On Friday, October 31, 2008 11:26 AM Mythran wrote:

>>>>>>> "Bob Egan" <Bob Eg...@discussions.microsoft.com> wrote in message
>>>>>>> news:E0D237ED-83EE-49AA...@microsoft.com...
>>>>>>>
0 new messages