Я создал пакет Visual Studio 2012 (используя VS2012 SDK). Это расширение (если оно установлено в среде IDE клиента) должно иметь, среди прочего, функциональность сбора всех определенных типов из текущего открытого решения, над которым работает разработчик. Аналогичная функция встроена в Visual Studio Designer для проекта приложения ASP.NET MVC, где разработчик реализует класс модели/контроллера, создает проект, а затем может получить доступ к этому типу в пользовательском интерфейсе Scaffolding (раскрывающийся список конструктора). Соответствующие функции также доступны в WPF, WinForms Visual Designers и т. д.
Допустим, мое расширение должно собрать все типы из текущего решения, которые реализуют интерфейс ISerializable
. Шаги следующие: разработчик создает определенный класс, перестраивает содержащий проект/решение, затем выполняет некоторые действия, предусмотренные пользовательским интерфейсом расширения, таким образом, включает сбор ISerializable
types.
Я попытался реализовать операцию сбора с использованием отражения:
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"}
(...)
Как я могу правильно реализовать операцию сбора определенных типов из текущего решения?