Visual studio 2010 Visual Studio多项目模板:项目参考问题
上下文:我目前正在开发一个VB.NET多项目模板,其中包含它们之间的交叉引用,这几乎可以正常工作 问题: VS为生成的每个项目生成新的GUID,并将其更新为新的.sln和每个新的.vbproj,但从不以相同的方式将项目引用更新为.vbproj 下面是一个.vbproj示例: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
<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>