14

背景:我想创建一个自定义 VB 编译器,扩展“原始”编译器,以处理我的自定义编译时属性。

问题:在我创建了我的自定义编译器并且我有一个能够通过标准命令行界面编译 VB 代码的可执行文件之后,我如何将此编译器与 Visual Studio IDE 集成?(这样按“编译”或“构建”将使用我的编译器而不是默认编译器)。

编辑:(如果我错了,请纠正我)

从这里的反应,我看到这个问题有点令人震惊,所以我将进一步解释我的需求和背景:.NET 为我们提供了一个很棒的机制,称为 Attributes。据我了解,使属性将其预期行为应用于属性元素(程序集、模块、类、方法等) - 必须反映属性。所以这里真正的诀窍是在正确的位置反映和应用行为。

让我们以序列化为例:我们用 Serializable 属性装饰一个类。然后我们将类的一个实例传递给格式化程序的 Serialize 方法。格式化程序反映实例,检查它是否具有 Serializable 属性,并采取相应的行动。

现在,如果我们检查 Synchronization、Flags、Obsolete 和 CLSCompliant 属性,那么真正的问题是:谁反映了它们?至少在某些情况下,它必须是编译器(和/或 IDE)。因此,似乎如果我希望创建自定义属性来改变元素的行为而不管任何特定的消费者,我必须扩展编译器以在编译时反映它们。

当然,这些不是我个人的见解:《Applied .NET Attributes》一书提供了创建自定义属性和自定义 C# 编译器以在编译时反映该属性的完整示例(该示例用于实现“java-style检查异常”)。

4

2 回答 2

4

查看“ BuildAction 属性”和“ CustomTool 属性”。

几年前,我阅读了一篇关于创建自定义编译器、注册它并设置这些属性的优秀文章。我现在找不到该文章,但这应该可以帮助您入门。

于 2010-04-13T11:02:42.453 回答
2

在http://msdn.microsoft.com/en-us/library/ms171452.aspx查看“MSBuild 概述” 。Visual Studio 项目是 MSBuild 项目。我相信你所要做的就是做一些小的改变。我没有为编译器做过,但我在编译后用 ILMerge 做了,效果很好。无缝甚至可以调试合并的程序集。

于 2010-04-13T11:44:34.270 回答