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項目。