Windows 7(64)下VS2008中的VB:
我需要在设计模式中某个不可预测的时间更改组件的属性值,并希望将以前未知的新值嵌入到由 VS 编译产生的可执行文件中(而不是将其序列化到某个外部文件)。
我采用了文本编辑将新值交换到预构建事件处理程序中自动生成的组件初始化代码中。这很好用,但对我来说有点老套。有没有办法强制 VS 刷新该文本?
Windows 7(64)下VS2008中的VB:
我需要在设计模式中某个不可预测的时间更改组件的属性值,并希望将以前未知的新值嵌入到由 VS 编译产生的可执行文件中(而不是将其序列化到某个外部文件)。
我采用了文本编辑将新值交换到预构建事件处理程序中自动生成的组件初始化代码中。这很好用,但对我来说有点老套。有没有办法强制 VS 刷新该文本?
幸运的是,我发现了一些似乎可以强制 VS 为组件的运行时实例自动生成初始化代码的东西,这就是我所追求的(我需要在组件的设计时和运行时之间进行成功的通信——对于控件来说很容易,它在运行时使用最新的设计时 BackgroundImage 位图(您只需要在位图中隐藏属性值,这可以通过使用 GetPixel 和 SetPixel 完全在规则内完成)。我考虑了各种黑客,但我遇到了以下问题,有效且有意义(尽管我可能完全不了解“为什么”。如果您知道得更好,请教育我):
据我了解,在 VS 中的设计图面上放置一个组件后不久(在组件托盘中呈现它之前),Visual Studio 将其添加到属于容器的组件集合中。将它添加到 Container 的集合是一系列事件中的一个步骤,其中包括 Visual Studio 的 Init 过程的自动重新生成,该过程将在运行时用于组件的根,并且包括组件的公共属性的值。如果您为您的组件重载设置站点过程(创建 ISite 是该序列中的早期步骤),并在重载中为其公共属性之一设置一个值,该值将显示在 autoregen 文本中. 这几乎是我想要的,除了它只在 VS 调用 Set Site 时有效,而且我需要它在我选择的任何时候发生。
然后我拿了一张传单,在设置有问题的属性值的 UI 中(在某个不可知的时间),我添加了代码以从容器的集合中删除组件,然后重新添加它,希望这可能会再次引发会导致 VS 再次自动重新生成 Init 代码的一系列事件,这一次是使用 Property 的新值。它显然做到了。耶。
通过决定何时将组件重新添加到容器的组件集合中,我现在能够强制 VS 在自动生成的初始化文本中写入我分配给该组件的公共属性的任何值,从而在执行时将该值嵌入到可执行文件中它被编译。
这种技术很容易受到微软实现自动生成的(未记录的)方式变化的影响,因此可以说是一种黑客攻击。但即使是记录在案的功能也可能会发生变化。向后兼容是个好主意,但有时不得不让步。交付是一项要求。很高兴知道您的代码在任何未来版本的 VS 中仍然很好,但遗憾的是,无论是否破解,这都不会发生。
当然,与未记录的特性相比,记录在案的特性通常较少受到更改。但是在设置所有初始属性值之后自动生成的逻辑非常引人注目。微软稍后使用相同的序列并不是那么合乎逻辑,但是以不同的方式这样做会花费微软的钱而没有明显的收益。微软及其同类公司(法律要求)根据底线做出决定。因此,现状似乎是一个不错的选择。