Visual Studio SDK 获取类型修饰符信息 - 类型是抽象类型还是内部类型?

Visual Studio SDK get type modifier information - is type abstract or internal?

我使用IVsObjectList2.GetCategoryField2方法来检索一个类型的不同信息。

现在我想知道如何检索特定于 C# 的信息,例如类型的 abstractinternal 修饰符? 对象浏览器可以显示这些信息。

更新 1:

我再次尝试获取此信息。通过 DynamicTypeServiceIVsHierarchy(项目的)我可以获得 TypeResolutionService。这可以 return 我正在寻找的 Type,并形成我得到信息的类型(内部、抽象等)

遗憾的是,这仅适用于 .NET Framework 项目。 .NET Core 项目不起作用。假设是.NET core项目导致解析时出现问题,因为.NET Framework下的VS插件(或Visual StudioSDK)运行

var dte = Package.GetGlobalService(typeof(DTE)) as DTE2;
var serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);

IVsSimpleObjectList2 objectList;
....
objectList.CountSourceItems(index, out var vsHierarchy, out var itemid, out var pcItems);

DynamicTypeService dynamicTypeService = (DynamicTypeService)serviceProvider.GetService(typeof(DynamicTypeService));
var typeResolutionService = dynamicTypeService.GetTypeResolutionService(hier);
var type = typeResolutionService.GetType("ObjectBuilder.ObjectBrowserTestTypes.AbstractTestClass");

我仍在寻找解决方案。有人有其他想法吗?

最后,我决定不通过对象浏览器或 IVsObjectManager2 检索有关类型的信息。原因是我没有得到我需要的所有信息。

对于当前加载的 visual studio 项目中的类型,我使用 ElementClassCodeClass class.

var service = Package.GetGlobalService(typeof(DTE)) as DTE2;
Project project = service?.Solution?.Projects.Item(0);
CodeType codeType = project.CodeModel.CodeTypeFromFullName("Full name of Type");

if (codeType.Kind == vsCMElement.vsCMElementClass && codeType is CodeClass2 codeClass)
{
    // get all the information form the code class
    var typeDescription = new TypeDescription();
    typeDescription.FullName = codeClass.FullName;
    typeDescription.ContainsGenericParameters = codeClass.IsGeneric;
    typeDescription.IsAbstract = codeClass.IsAbstract;
}

对于引用程序集中的类型,我使用 Mono.Cecil。 Mono.Cecil 的优点是,它适用于 .NET Framework DLL 和 .NET Core DLL。引用程序集的路径可以通过VS-SDK获取。

var vsProject = project.Object as VSLangProj.VSProject;
var assemblyPath = vsProject.References.Item(0).Path;

ModuleDefinition module = Mono.Cecil.ModuleDefinition.ReadModule(assemblyPath);
foreach (TypeDefinition type in module.Types)
{
    var isAbstract = type.IsAbstract;
}