Visual studio 2010 Visual Studio多项目模板:项目参考问题

Visual studio 2010 Visual Studio多项目模板:项目参考问题,visual-studio-2010,visual-studio,templates,msbuild,multi-project,Visual Studio 2010,Visual Studio,Templates,Msbuild,Multi Project,上下文:我目前正在开发一个VB.NET多项目模板,其中包含它们之间的交叉引用,这几乎可以正常工作 问题: VS为生成的每个项目生成新的GUID,并将其更新为新的.sln和每个新的.vbproj,但从不以相同的方式将项目引用更新为.vbproj 下面是一个.vbproj示例: <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003

上下文:我目前正在开发一个VB.NET多项目模板,其中包含它们之间的交叉引用,这几乎可以正常工作

问题: VS为生成的每个项目生成新的GUID,并将其更新为新的.sln和每个新的.vbproj,但从不以相同的方式将项目引用更新为.vbproj

下面是一个.vbproj示例:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProductVersion>
    </ProductVersion>
    <SchemaVersion>
    </SchemaVersion>
    <ProjectGuid>{_NewGUIDGeneratedByVS_}</ProjectGuid>
    <OutputType>Library</OutputType>
    <RootNamespace>Template.DataModel</RootNamespace>
    <AssemblyName>Template.DataModel</AssemblyName>
    <FileAlignment>512</FileAlignment>
    <MyType>Windows</MyType>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>
然后在另一个.vbproj中:正如预期的那样,
$Sguid6$
将采用我告诉他在我的
replacementsDictionary
中采用的GUID

<ProjectReference Include="..\$safeprojectname$.DataModel\$safeprojectname$.DataModel.vbproj">
  <Project>{$Sguid6$}</Project>
  <Name>$safeprojectname$.DataModel</Name>
  <Private>True</Private>
</ProjectReference>

{$Sguid6$}
$safeprojectname$.DataModel
真的

问题:我如何告诉VS正确交换所有这些GUID,或者至少不更改它们

我找到了另一种选择:我们需要通过
IWizard
手动设置项目引用。只需在
RootIWizard
中添加/编辑您的
ProjectFinishedGenerating
方法:

public void ProjectFinishedGenerating(EnvDTE.Project)
{
//将存储与模板相关的所有引用
字典lReferences=新字典();
foreach(pDTE.Solution.Projects.Cast()中的项目p)
{
lReferences.Add(p.Name,p);
}
//将为从模板调用的每个特定项目添加所有必需的引用
foreach(pDTE.Solution.Projects中的项目p)
{
VSLangProj80.vsproject2vsproj=(VSLangProj80.VSProject2)p.Object;
if(p.Name.IsMatchProjectName(“服务”))
{
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“数据模型”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“WS”)).Value);
}
else if(p.Name.IsMatchProjectName(“Web”))
{
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“数据模型”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“WS”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“服务”)).Value);
}
else if(p.Name.IsMatchProjectName(“WinForms”))
{
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“数据模型”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“WS”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.IsMatchProjectName(“服务”)).Value);
vsproj.References.AddProject(lReferences.Single(f=>f.Key.Contains(“SortableBindingList”)).Value);
}
vsproj.Refresh();
vsproj.Project.Save();
}
pDTE.Solution.SolutionBuild.Build(true);
}

我也遇到了这个问题(但使用C#!),我只是通过删除模板项目文件中
标记中的
{GUID}
来解决它

引用由路径和名称解析

更多的讨论可以在这里找到:这里还指出,
并不重要。然而,正如另一位用户所说,它似乎不适用于Azure项目

<ProductVersion>8.0.50727</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{$Sguid6$}</ProjectGuid>
    <OutputType>WinExe</OutputType>
    <StartupObject>$safeprojectname$.My.MyApplication</StartupObject>        <RootNamespace>$safeprojectname$</RootNamespace>
    <AssemblyName>$safeprojectname$</AssemblyName>
<ProjectReference Include="..\$safeprojectname$.DataModel\$safeprojectname$.DataModel.vbproj">
  <Project>{$Sguid6$}</Project>
  <Name>$safeprojectname$.DataModel</Name>
  <Private>True</Private>
</ProjectReference>