C# · 12月 27, 2021

c# – .NET Windows窗体设计时间规则

我有一个对象启动一个线程,打开一个文件,并等待其他类的输入.当它接收输入时,它将其写入磁盘.基本上这是一个线程安全的数据记录类…

这是奇怪的部分.当我在设计器(Visual Studio 2008)中打开一个表单时,使用该文件创建的对象.这显然是在设计时运行vhost进程…

奇怪的是,我还没有在另一个项目中重现这个问题.我不知道在设计器中执行的代码和没有的代码的规则是什么.例如,在Windows窗体构造函数中创建文件实际上并不会在设计时创建文件…

有什么解释?有参考吗?

解决方法 您可以检查LicenseManager的UsageMode,以检查代码是否在设计时间.

System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime

这是一个快速的例子:

using System;using System.ComponentModel;using System.Windows.Forms;namespace Test{ public class ComponentClass : Component { public ComponentClass() { Message@R_802_2419@.Show(“Runtime!”); } }}

当这个组件在设计器中添加到您的表单中时,您将立即获取一个消息框.

为了防止这种情况,您可以添加一个简单的if语句来检查代码是否不在设计时

using System;using System.ComponentModel;using System.Windows.Forms;namespace Test{ public class ComponentClass : Component { public ComponentClass() { if (LicenseManager.UsageMode != LicenseUsageMode.Designtime) { Message@R_802_2419@.Show(“Runtime!”); } } }}

添加if语句后,通过设计器将组件添加到表单时,消息框不再显示.

我希望这有帮助.

-jeremy