gpt4 book ai didi

c# - 如何使用 Visual Studio 扩展从当前解决方案中收集类型?

转载 作者:太空狗 更新时间:2023-10-29 21:58:09 24 4
gpt4 key购买 nike

我已经创建了 Visual Studio 2012 包(使用 VS2012 SDK)。此扩展(如果安装在客户端的 IDE 环境中)应具有从开发人员正在处理的当前打开的解决方案中收集所有特定类型的功能。 Visual Studio 设计器中嵌入了一个类似的功能,用于 ASP.NET MVC 应用程序项目,开发人员在其中实现模型/ Controller 类,构建项目,然后能够在脚手架 UI(设计器的下拉列表)中访问此类型。 WPF、WinForms Visual Designers 等也有相应的功能。

假设我的扩展程序必须从当前解决方案中收集所有类型,这些解决方案实现了 ISerializable 接口(interface)。步骤如下:开发人员创建特定类,重建包含项目/解决方案,然后执行扩展 UI 提供的一些操作,因此涉及执行 ISerializable 类型收集。

我尝试过使用反射实现收集操作:

List<Type> types = AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(ISerializable).IsAssignableFrom(p) && !p.IsAbstract).ToList();

但上面的代码导致抛出 System.Reflection.ReflectionTypeLoadException 异常:

System.Reflection.ReflectionTypeLoadException was unhandled by user code
HResult=-2146232830
Message=Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Source=mscorlib
StackTrace:
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.RuntimeModule.GetTypes()
at System.Reflection.Assembly.GetTypes()
(...)
LoaderException: [System.Exception{System.TypeLoadException}]
{"Could not find Windows Runtime type 'Windows.System.ProcessorArchitecture'.":"Windows.System.ProcessorArchitecture"}
(...)

如何正确实现从当前构建的解决方案中收集特定类型的操作?

最佳答案

我试图做类似的事情,不幸的是,到目前为止我发现的唯一解决方法是执行以下操作(我觉得这有点困惑,但也许针对特定情况进行一些调整可能没问题)

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
IEnumerable<Type> types = assemblies.SelectMany(x => GetLoadableTypes(x));

...

public static IEnumerable<Type> GetLoadableTypes(Assembly assembly)
{
try
{
return assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
return e.Types.Where(t => t != null);
}
}

这将为您提供所有 类型,但您可以过滤掉任何您想要的类型。

引用了这篇文章:How to prevent ReflectionTypeLoadException when calling Assembly.GetTypes()

关于c# - 如何使用 Visual Studio 扩展从当前解决方案中收集类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19142579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com