Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在编译之前强制VS自动注册_Vb.net_Visual Studio_Msbuild_Components - Fatal编程技术网

Vb.net 在编译之前强制VS自动注册

Vb.net 在编译之前强制VS自动注册,vb.net,visual-studio,msbuild,components,Vb.net,Visual Studio,Msbuild,Components,Windows 7(64)下VS2008中的VB: 我需要在DesignMode中的某个不可预测的时间更改组件属性的值,并希望将以前未知的新值嵌入到VS编译产生的可执行文件中(而不是将其序列化到某个外部文件) 我求助于文本编辑,将新值交换到预构建事件处理程序中自动生成的组件初始化代码中。这很好用,但对我的口味来说有点粗糙。有没有办法强制VS刷新该文本 幸运的是,我发现了一些似乎可以强制VS为组件的运行时实例自动生成初始化代码的东西,这正是我所追求的(我需要在组件的设计时和运行时之间成功通信——对

Windows 7(64)下VS2008中的VB:

我需要在DesignMode中的某个不可预测的时间更改组件属性的值,并希望将以前未知的新值嵌入到VS编译产生的可执行文件中(而不是将其序列化到某个外部文件)


我求助于文本编辑,将新值交换到预构建事件处理程序中自动生成的组件初始化代码中。这很好用,但对我的口味来说有点粗糙。有没有办法强制VS刷新该文本

幸运的是,我发现了一些似乎可以强制VS为组件的运行时实例自动生成初始化代码的东西,这正是我所追求的(我需要在组件的设计时和运行时之间成功通信——对于控件来说很容易,它们在运行时使用最新的设计时背景图像位图)(您只需在位图中隐藏属性值,这完全可以通过使用GetPixel和SetPixel在规则范围内完成)。我考虑了各种破解方法,但我想到了以下方法,这些方法可行且有意义(尽管我可能完全不知道“为什么”。如果您知道得更好,请教育我):

据我所知,组件在VS中放置到设计图面后不久(以及在组件托盘中渲染之前),Visual Studio将其添加到属于容器的组件集合中。将其添加到容器集合是一系列事件中的一个步骤,包括Visual Studio在运行时自动重新生成用于组件根目录的Init过程,其中包括组件的公共属性值如果设置站点过程过载(ISite的创建是该序列的早期步骤)对于您的组件,并在重载中为其公共属性之一设置一个值,该值将显示在自动注册文本中。这几乎是我想要的,只是它只在VS调用set Site时起作用,并且我需要它在我选择的任何时间发生

然后我拿了一张传单,在UI中设置了有问题的属性值(在某个不可知的时间),我添加了从容器集合中删除组件的代码,然后重新添加,希望这可能会再次引发一系列事件,导致VS再次自动重新生成初始化代码,这次使用属性的新值。显然是这样。耶

通过决定何时将组件重新添加到容器的Components集合中,我现在可以强制VS在自动生成的Init文本中写入我分配给该组件的公共属性的任何值,从而在编译时将该值嵌入可执行文件中

此技术易受中更改的影响(未记录)微软实现自动生成的方式,可以说是一种黑客行为。但即使是有文档记录的功能也可能会发生变化。向后兼容是一个好主意,但有时它不得不让步。交付是一项要求。如果知道你的代码在未来的VS版本中仍然是好的,那就太好了,但遗憾的是,这不可能实现不管是笔还是黑客


当然,文档化的功能通常比未文档化的功能更不易更改。但是,在设置所有初始属性值后自动生成的逻辑非常引人注目。Microsoft以后使用相同的序列并不是天生的逻辑,但是使用不同的方法将花费Microsoft的资金或者没有明显的收益。微软和他们的同类(法律要求)根据底线做出决策。因此,保持现状似乎是一个不错的选择。

对于exxpand,有一点:当我以编程方式更改组件属性值时,新值会如预期的那样出现在VS属性浏览器中,但不会传播到自动生成的文本中。VS自动生成的触发器似乎是一些物理操作(即鼠标或键盘)由属性浏览器中的VS用户执行。(续)我所追求的是在不依赖VS UI中的用户操作的情况下触发自动生成。