Поделиться через


Общие сведения о применении объекта CodeModel в приложениях Visual Basic и Visual C#

Обновлен: Ноябрь 2007

Иногда возникает необходимость в программной проверке структуры кода в приложении Visual C#, Visual Basic или Visual J#. Возможно, имеет смысл изучить пространства имен, определенные в приложении, и их взаимоотношения. Также может понадобиться создать документ с перечнем классов и их открытых членов для документации.

Объект CodeModel2 является объектом общей расширяемости, обеспечивающим доступ к коду приложения. Объект CodeModel2 не предоставляет текст исходного кода. Вместо этого он предоставляет многоуровневую коллекцию, которая представляет элементы кода. Например, каждое пространство имен в коде представлено объектом CodeNamespace. Объект CodeModel2, связанный с проектом, взаимодействует со свойством CodeModel.

Объект FileCodeModel2 является объектом общей расширяемости, обеспечивающим доступ к коду в одном файле исходного кода. Каждый исходный файл в приложении представлен объектом ProjectItem, а объект FileCodeModel2, связанный с элементом проекта, находится в свойстве FileCodeModel.

Объекты CodeModel2 и FileCodeModel2 предоставляют соответственно свойства CodeModel2.CodeElements и FileCodeModel.CodeElements, то есть коллекцию объектов CodeElement2. Поддержка объектов CodeModel2 и FileCodeModel в Visual Basic, Visual C# и Visual J# несколько различается. Пример реализации Visual Basic см. в разделах Практическое руководство. Поиск кода при помощи модели кода (Visual Basic) и Практическое руководство. Анализ кода Visual Basic с помощью объекта CodeModel. Пример реализации Visual C# см. в разделах Практическое руководство. Поиск кода при помощи модели кода (Visual C#) и Практическое руководство. Создание класса C# с помощью объекта CodeModel.

В некоторых языках не реализуется полная модель кода Visual Studio. Исключения, если они есть, указаны в справке. Большинство различий между реализациями модели кода вызвано функциональными различиями языков. Например, нельзя добавить функции к объектам CodeNamespace в Visual Basic, Visual C# или Visual J#, поскольку определять функции на верхнем уровне позволяет только Visual C++.

Основные объекты модели кода перечислены в следующей таблице. Полный список методов и свойств для каждого объекта см. в следующих разделах.

Тип

Описание

CodeNamespace

Предоставляет конструкцию пространства имен в файле исходного кода.

CodeStruct2

Предоставляет структуру в исходном коде.

CodeInterface2

Предоставляет интерфейс в исходном коде.

CodeClass2

Предоставляет класс в исходном коде.

CodeEnum

Предоставляет перечисление в исходном коде.

CodeVariable2

Определяет переменную конструкцию в исходном файле.

CodeDelegate2

Предоставляет делегат в исходном коде.

CodeElement2

Предоставляет элемент или конструкцию кода в исходном файле.

CodeEvent

Моделирует элемент события кода.

CodeProperty2

Определяет конструкцию свойства в исходном файле.

CodeAttribute2

Определяет атрибут для элемента кода.

CodeImport

Моделирует использование операторов, импортирующих пространства имен.

CodeFunction2

Представляет конструкцию функции в файле исходного кода.

CodeParameter2

Определяет параметр для функции, свойства и т. д.

Вложенные элементы кода

Элементы кода в приложении организованы в виде вложенной архитектуры. Например, объект элемента проекта FileCodeModel2 может содержать в своей коллекции CodeElements элемент кода для пространства имен. Объект CodeNamespace, представляющий это пространство имен, возможно, содержит в своем свойстве Members несколько других элементов кода, представляющих классы. Каждый элемент CodeClass2, в свою очередь, может включать элементы кода, представляющие свойства (объект CodeProperty2) и методы (объект CodeFunction2). Методы извлечения вложенных элементов кода зависят от их типа и описываются в следующем разделе.

Категории элементов кода

Класс CodeElement2 является базовым и представляет все элементы кода в элементе проекта (исходном файле). Многие классы являются производными от класса CodeElement2, представляющими различные конструкции в приложении, в том числе пространства имен, классы, свойства, методы и события. Существуют две основных категории элементов кода, первая из которых представляет типы, а вторая — нет.

Некоторые элементы кода в приложении представляют типы. Эти элементы кода являются производными объекта CodeType, также как объекта CodeElement2:

Свойство IsCodeType позволяет определить, относится ли ссылка на объект CodeElement2 к одному из этих типов. Чтобы найти вложенные элементы кода, относящиеся к этим типам, воспользуйтесь свойством Members, которое возвращает коллекцию CodeElements. В разделе Практическое руководство. Анализ кода Visual Basic с помощью объекта CodeModel содержится пример, находящий все классы в проекте.

Способ поиска элементов кода, вложенных в другие типы элементов кода, зависит от типа вложенного элемента кода. Например, поскольку свойство имеет только методы Get и Set, связанный со свойством объект CodeProperty2 имеет свойства Getter и Setter, возвращающие элементы CodeFunction2. В нижеприведенном списке представлены свойства, использующиеся для поиска вложенных элементов кода для различных типов элемента кода.

Тип

Свойство

CodeFunction

Parameters

CodeNamespace

Members

CodeProperty

Getter и Setter.

Элементы кода из внешних ссылок

В коде могут содержаться объявления типа, полученные из типов, определенных в ссылках проекта. (Ссылки проекта добавляются с помощью диалогового окна Добавление ссылок или метода расширения References.Add). Система работы с проектами Visual Basic не определяет объекты CodeTypeRef2, представляющие эти ссылки, кроме их имен. Поэтому при попытке воспользоваться любым другим свойством или методом объекта CodeElement2, связанного со ссылкой, не являющимся свойством Name, будет создано исключение "Не реализовано". Для объектов CodeType, представляющих внешние ссылки, для свойства InfoLocation задано значение vsCMInfoLocationNone.

Ошибки компилятора и объект CodeModel

При написании кода, поддерживающего ссылки на объекты CodeElement2, необходимо знать, что базовый исходный код может изменить сохраненную ссылку. Элемент кода может быть удален, переименован или включен в ошибку компилятора. Если это происходит, при любых обращениях к объекту CodeElement2 будет возвращено сообщение об ошибке "Исключение из HRESULT: 0x80047E2C".

См. также

Задачи

Практическое руководство. Анализ кода Visual Basic с помощью объекта CodeModel

Устранение неполадок расширения среды Visual Basic и Visual C#

Основные понятия

Практическое руководство. Поиск кода при помощи модели кода (Visual Basic)

Практическое руководство. Поиск кода при помощи модели кода (Visual C#)