在我的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 属性?
还是我要以完全错误的方式来解决这个问题?
答案 0 :(得分:2)
您可以查找TargetFrameworkMoniker:
public static bool IsNetCore2(this Project project)
{
return project.Properties.Item("TargetFrameworkMoniker").Value.ToString().Contains(".NETCoreApp,Version=v2.");
}
要检测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 集合。