我正在开发一个基于 .NET 2.0 插件的应用程序。我的应用程序在运行时通过 System.Reflection 检查指定目录中的其他 .NET 程序集来检测/加载插件。这很好用。我的应用程序包含一个 PropertyGrid 控件,该控件由加载的插件中存在的 [Browsable(true)] 属性填充。在此 PropertyGrid 中,browsable-true-properties 表现出以下行为:
- 基本/原始类型(布尔、字符串等)的属性正确加载和清理
- 当用户在运行时不修改时,用户定义类型的属性(如插件端定义的枚举)正确加载并正确清理。
- 如果用户在运行时修改了非标准类型(即通过 PropertyGrid 更改枚举的值),则应用程序在关闭时挂起。这是我的问题。
使用 Visual Studio .NET 2005 和 Red Gate 的 Reflector,我能够从 Microsoft.Win32.SystemEvents.WindowThreadProc 中隔离出以下代码段的挂起(我正在使用原始程序集,但我 99% 确定这是正确的地方):
while (flag)
{
if (UnsafeNativeMethods.MsgWaitForMultipleObjectsEx(0, IntPtr.Zero, 100, 0xff, 4) != 0x102)
{
goto Label_0072;
}
Thread.Sleep(1);
continue;
Label_0053:
if (msg.message == 0x12)
{
flag = false;
continue;
}
UnsafeNativeMethods.TranslateMessage(ref msg);
UnsafeNativeMethods.DispatchMessage(ref msg);
Label_0072:
if (UnsafeNativeMethods.PeekMessage(ref msg, NativeMethods.NullHandleRef, 0, 0, 1))
{
goto Label_0053;
}
}
似乎“标志”没有设置为真,因此我的程序永远处于这个循环中。我发现有人在 .NET 247 遇到类似问题,但他推荐的解决方法是:
System.Threading.Thread.CurrentThread.SetApartmentState(Threading.ApartmentState.STA)
似乎没有解决问题。
有什么想法吗?
提前致谢。