如何在Visual Studio扩展中识别ASP.NET Core项目

时间:2019-01-06 13:12:15

标签: visual-studio asp.net-core vsix

在我的Visual Studio程序包中,我查看解决方案中的每个项目,我需要确定它是哪种项目。

从历史上看,我使用类似于Carlos Quintero here描述的技术来获取项目GUID,并在列表中查找特定的GUID。

对于ASP.NET Core项目,我一直在寻找

AspNetCore:  "{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}"
AspNetCore2: "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"

如果项目使用旧式项目文件,这可能仍然可以工作。

但是,如果使用新的Visual Studio Project系统,则无法使用。

这是我当前正在使用的项目文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
  </ItemGroup>

  <ItemGroup>
    <Compile Update="App_GlobalResources\Resources.Designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>Resources.resx</DependentUpon>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="App_GlobalResources\Resources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Controllers\App_LocalResources\HomeController.resx.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Controllers\HomeController.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Controllers\HomeController.nl.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Controllers\HomeController.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Controllers\StudentController.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Models\Student.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Views\Home\About.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Views\Home\Contact.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Views\Home\Index.en.resx">
      <Generator></Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Resources\Views\Home\Index.resx">
      <Generator></Generator>
    </EmbeddedResource>
  </ItemGroup>

</Project>

如您所见,它不包含项目GUID。

使用How to detect whether a project is a CPS project中描述的技术,我可以检测到它是一个CPS(通用项目系统)项目。

使用Finding CPS in a VS project中描述的技术,我可以掌握“未配置的项目”,也可以获取“已配置的项目”(尽管我不确定我了解什么是“未配置的”)。和“已配置”是指这种情况。

这时我被困住了。我不知道如何确定它是否是ASP.NET Core项目。

最好的选择可能是获得 TargetFramework 属性,即 netcoreapp2.0 。有什么方法可以从CPS项目对象获取 TargetFramework 属性?

还是我要以完全错误的方式来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以查找TargetFrameworkMoniker:

    public static bool IsNetCore2(this Project project)
    {
        return project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETCoreApp,Version=v2.");
    }

https://github.com/ErikEJ/EFCorePowerTools/blob/master/src/GUI/EFCorePowerTools/Extensions/ProjectExtensions.cs#L75

要检测ASP.NET Core,我认为您必须解析csproj文件: 并查找 Sdk =“ Microsoft.NET.Sdk.Web”

答案 1 :(得分:0)

可能一个好的解决方案是使用 nuget 包 Microsoft.Build 中的 MsBuild API。

如果您有 ENVDte.Project 对象,则可以使用 FullName 属性获取项目文件的路径。

然后您可以按如下方式访问 Sdk 属性:

void foo ( ENVDte.Project prj )
{
  var MsBuildProject = new Microsoft.Build.Evaluation.Project ( prj.FullName ) ;
  
  if ( string.IsNullOrEmpty ( MsBuildProject.Xml.Sdk ) )
  {
    // Not .NET core
  }
  else if ( MsBuildProject.Xml.Sdk == "Microsoft.NET.Sdk.Web" )
  {
    // ASP.NET core
  }
  else if ( MsBuildProject.Xml.Sdk == "Microsoft.NET.Sdk.WindowsDesktop" )
  {
    // .NET core desktop app
  }
}  

这实际上与解析项目文件并查找 Sdk="Microsoft.NET.Sdk.Web" 一样,正如 Eric 已经建议的那样,但如果可能,我更喜欢使用 API。

如果您正在寻找有关该项目的其他详细信息,MsBuild 项目对象中有更多信息,例如 AllEvaluatedItems 集合或 AllEvaluatedProperties 集合。