.net 将自定义编译器与Visual Studio IDE集成

.net 将自定义编译器与Visual Studio IDE集成,.net,visual-studio,compiler-construction,ide-customization,.net,Visual Studio,Compiler Construction,Ide Customization,背景:我想创建一个自定义VB编译器,扩展“原始”编译器,以处理自定义编译时属性 问题:在我创建了自定义编译器并获得了能够通过标准命令行界面编译VB代码的可执行文件后,如何将此编译器与Visual Studio IDE集成?(这样按“编译”或“构建”将使用我的编译器而不是默认编译器) 编辑:(如果我错了,请纠正我) 从这里的反应来看,我看到这个问题有点令人震惊,所以我将进一步解释我的需求和背景: NET为我们提供了一种称为属性的强大机制。据我所知,使属性将其预期行为应用于属性化元素(程序集、模块、

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

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

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

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

让我们以序列化为例:我们用Serializable属性装饰一个类。然后,我们将该类的一个实例传递给格式化程序的序列化方法。格式化程序对实例进行反射,检查它是否具有可序列化属性,并相应地执行操作

现在,如果我们检查同步、标志、过时和CLSCompliant属性,那么真正的问题是:谁会考虑它们?至少在某些情况下,它必须是编译器(和/或IDE)。因此,如果我希望创建改变元素行为的自定义属性,而不考虑任何特定的使用者,那么我必须扩展编译器以在编译时反映它们

当然,这些并不是我个人的见解:这本书提供了一个完整的示例,介绍了如何创建自定义属性和自定义C#编译器,以在编译时反映该属性(该示例用于实现“java样式检查异常”)

签出“”和“”


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

请访问“MSBuild概述”。Visual Studio项目是MSBuild项目。我相信你所要做的就是做一些小的改变。我没有为编译器做过,但我在编译后用ILMerge做过,效果很好。无缝甚至可以调试合并的程序集。

真的吗?你真的想这么做?为什么不?这不像“M.A.哈宁”试图在他的领域之外做什么。@M.A.哈宁:我不会解释。如果他们感到震惊,那么他们不应该回答这个问题。对吗?@AMissico,我认为恐惧和震惊应该用理性来解决。当然,当人们让你觉得“这超出了你的能力范围”时,这并不有趣,特别是当他们不为自己的主张辩护时,但我愿意解释自己——只是因为我的解释有可能引起有见地的评论。顺便说一句,非常感谢你的回答,我给你+2。@M.A.哈宁:好书,我在书中增加了阅读内容。我非常喜欢自定义属性。特别是在Enum上。原来的链接已失效,所以我将其替换,但我不能确定新链接是否正确。然而,他们似乎或多或少都在谈论这个话题。