0

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

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

在此处输入图像描述

更新1:

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

不幸的是,这只适用于 .NET Framework 项目。.NET Core 项目不起作用。假设是 .NET 核心项目在解决时会导致问题,因为 VS 插件(或 Visual Studio SDK)在 .NET Framework 下运行。

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");

更多信息:Visual Studio Extension 获取所有类和接口元数据

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

4

1 回答 1

0

最后,我决定不通过 Object-Browser 或IVsObjectManager2. 原因是我没有得到我需要的所有信息。

对于当前加载的 Visual Studio 项目中的类型,我使用的是ElementClassorCodeClass类。

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;
}
于 2020-03-26T17:27:23.123 回答