Visual Basic 和 C# 应用程序的 CodeModel 对象概述
您可能需要以编程方式检查 Visual Basic 或 Visual C# 应用程序的代码结构。 您也许希望知道在应用程序中定义的命名空间及其嵌套关系。 或者,您可能要创建一个文档,该文档列出类及其公共成员作为文档的基础。
CodeModel2 对象是常规扩展性对象,提供对应用程序中代码的访问。 CodeModel2 对象不提供代码的文字列表, 而是提供表示代码元素的对象的嵌套集合。 例如,代码中的每个命名空间都由一个 CodeNamespace 对象表示。 与项目关联的 CodeModel2 对象可通过 CodeModel 属性访问。
FileCodeModel2 对象是常规扩展性对象,提供对单个源文件中的代码的访问。 应用程序中的每个源文件都由一个 ProjectItem 对象表示,而与项目项关联的 FileCodeModel2 对象包含在 FileCodeModel 属性中。
CodeModel2 和 FileCodeModel2 对象分别提供 CodeModel2.CodeElements 和 FileCodeModel.CodeElements 属性(CodeElement2 对象的集合)。 Visual Basic 和 Visual C# 以略微不同的方式支持 CodeModel2 和 FileCodeModel 对象。 有关 Visual Basic 实现的示例,请参见使用代码模型查找代码 (Visual Basic) 和如何:使用 CodeModel 对象分析 Visual Basic 代码。 有关 Visual C# 实现的示例,请参见使用代码模型查找代码 (Visual C#) 和如何:通过使用 CodeModel 对象创建 C# 类。
有些语言不实现整个 Visual Studio 代码模型。 存在异常时,帮助主题会指出这些异常。 代码模型的实现之间的大多数差异是由于语言间的功能差异引起的。 例如,无法将函数添加到 Visual Basic 或 Visual C# 中的 CodeNamespace 对象,因为只有 Visual C++ 提供了顶级函数定义。
下表列出了主代码模型对象。 单击链接以查看每个对象的方法和属性列表。
类型 |
说明 |
---|---|
表示源文件中的命名空间构造。 |
|
表示源代码中的结构。 |
|
表示源代码中的接口。 |
|
表示源代码中的类。 |
|
表示源代码中的枚举。 |
|
定义源文件中的变量构造。 |
|
表示源代码中的委托。 |
|
表示源文件中的代码元素或构造。 |
|
以代码事件元素为模型。 |
|
定义源文件中的属性构造。 |
|
定义代码元素的特性。 |
|
以输入命名空间的语句用法为模型。 |
|
表示源文件中的函数构造。 |
|
为函数、属性等定义参数。 |
嵌套代码元素
应用程序中的代码元素按嵌套结构组织。 例如,项目项的 FileCodeModel2 可在其 CodeElements 集合中包含命名空间的代码元素。 表示该命名空间的 CodeNamespace 对象可能包含几个其他代码元素,这些代码元素表示其 Members 属性中的类。 每个 CodeClass2 元素反过来可包含表示属性(CodeProperty2 对象)和方法(CodeFunction2 对象)的代码元素。 检索嵌套代码元素的方法取决于代码元素的类型,这将在下一节介绍。
代码元素类别
CodeElement2 类是表示项目项(源文件)中所有代码元素的基类。 许多类从 CodeElement2 派生以表示应用程序中的构造,包括命名空间、类、属性、方法和事件。 代码元素有两大类 — 表示类型的代码元素和不表示类型的代码元素。
应用程序中的某些代码元素表示类型。 这些代码元素从 CodeType 对象和 CodeElement2 对象中派生:
通过使用 IsCodeType 属性,可以确定对 CodeElement2 对象的引用是否为这些类型中的一种。 若要查找这些类型的嵌套代码元素,请使用 Members 属性,该属性返回一个 CodeElements 集合。 如何:使用 CodeModel 对象分析 Visual Basic 代码包含一个查找项目中的所有类的示例。
如何查找嵌套在其他代码元素类型下的代码元素取决于嵌套代码元素的类型。 例如,由于属性只有一个 Get 方法和一个 Set 方法,因此与属性关联的 CodeProperty2 对象具有返回 CodeFunction2 元素的 Getter 和 Setter 属性。 下表说明使用哪些属性查找代码元素类型的嵌套代码元素。
类型 |
属性 |
---|---|
CodeFunction |
|
CodeNamespace |
|
CodeProperty |
外部引用的代码元素
代码可包含在项目引用中定义的类型的类型声明。 (通过**“添加引用”**对话框或使用 References.Add 扩展性方法添加项目引用。)Visual Basic 项目系统不解析表示超出其名字的引用的 CodeTypeRef2 对象。 因此,如果您尝试使用与该引用关联的 CodeElement2 对象的任何其他属性或方法,而不是 Name 属性,将引发“未实现”异常。 这些引用称为“仅为类型名”代码元素。 表示外部引用的 CodeType 对象将 InfoLocation 属性设置为 vsCMInfoLocationNone。
编译器错误和 CodeModel 对象
如果您所编写的代码维持对 CodeElement2 对象的引用,则应注意在维持该引用时,基础源代码可能会发生更改。 该代码元素可能已被删除、重命名或出现编译器错误。 当出现这种情况时,对 CodeElement2 对象的任何调用都将返回错误消息“HRESULT 中的异常:0x80047E2C”。
请参见
任务
如何:使用 CodeModel 对象分析 Visual Basic 代码
Visual Basic 和 Visual C# 扩展性疑难解答