1

上下文:我目前正在研究一个VB.NET多项目模板,它们之间有交叉引用,这几乎可以工作。Visual Studio多项目模板:项目参考问题

问题: 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它指的是以前的项目:

<ProjectReference Include="..\Template.DataModel\Template.DataModel.vbproj"> 
      <Project>{_OldBoringGUID_}</Project> 
      <Name>Template.DataModel</Name> 
     </ProjectReference> 

一些端倪:我已经尝试过通过我的IWizard Root和Child派生类中的replacementsDictionary强制执行特定的GUID替换,但VS不断替换旧的GUID:

在这里,$Sguid6$标签将被VS忽略,并将被替换为新的闪亮GUID!

<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> 

接着又在另一个.vbproj:在$Sguid6$将采取GUID我告诉他对我的replacementsDictionary,符合市场预期。

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

问:我怎么能告诉VS正确地掉所有这些GUID,或至少不改变他们?

回答

0

我找到了一个替代方案:我们需要通过IWizard设置项目参考手册。只需添加/编辑ProjectFinishedGenerating方法在RootIWizard:

public void ProjectFinishedGenerating(EnvDTE.Project project) 
    { 
     //Will Store all referencies related to the template 
     Dictionary<String, Project> lReferences = new Dictionary<string, Project>(); 

     foreach (Project p in pDTE.Solution.Projects.Cast<Project>()) 
     { 
      lReferences.Add(p.Name, p); 
     } 

     //Will add for particular projects in the template all needed referencies 
     foreach (Project p in pDTE.Solution.Projects) 
     { 
      VSLangProj80.VSProject2 vsproj = (VSLangProj80.VSProject2)p.Object; 

      if (p.Name.IsMatchProjectName("Services")) 
      { 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("DataModel")).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("DataModel")).Value); 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("WS")).Value); 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("Services")).Value); 
      } 
      else if (p.Name.IsMatchProjectName("WinForms")) 
      { 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("DataModel")).Value); 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("WS")).Value); 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.IsMatchProjectName("Services")).Value); 
       vsproj.References.AddProject(lReferences.Single(f => f.Key.Contains("SortableBindingList")).Value); 
      } 

      vsproj.Refresh(); 
      vsproj.Project.Save(); 
     } 

     pDTE.Solution.SolutionBuild.Build(true); 
    } 
0

我也碰到了这个问题(但使用C#!),我只是通过模板项目文件中的<ProjectReference>标签中取出<Project>{GUID}</Project>解决它。

该引用由路径和名称解析。

更多的讨论可以在这里找到:MSDN在那里它也表明,<Project>并不重要。正如另一位用户所说,Hoewever似乎并不适用于Azure项目。