Visual Studio SDK 获取类型修饰符信息 - 类型是抽象类型还是内部类型?
Visual Studio SDK get type modifier information - is type abstract or internal?
我使用IVsObjectList2.GetCategoryField2
方法来检索一个类型的不同信息。
现在我想知道如何检索特定于 C# 的信息,例如类型的 abstract
或 internal
修饰符?
对象浏览器可以显示这些信息。
更新 1:
我再次尝试获取此信息。通过 DynamicTypeService
和 IVsHierarchy
(项目的)我可以获得 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 项目中的类型,我使用 ElementClass
或 CodeClass
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;
}
我使用IVsObjectList2.GetCategoryField2
方法来检索一个类型的不同信息。
现在我想知道如何检索特定于 C# 的信息,例如类型的 abstract
或 internal
修饰符?
对象浏览器可以显示这些信息。
更新 1:
我再次尝试获取此信息。通过 DynamicTypeService
和 IVsHierarchy
(项目的)我可以获得 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 项目中的类型,我使用 ElementClass
或 CodeClass
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;
}