我有一个使用多个由.NET编写的组件的Visual Basic 6.0应用程序。当Windows关闭时,该应用程序必须正常关闭。问题是,如果代码的.NET部分正在显示窗口,则应用程序会显示消息"无法退出"并无法退出。(然后被操作系统终止。)
我已成功地在简化的应用程序中重现了这个问题。
.NET代码创建一个WPF窗口,并使用ShowDialog()显示它:
正如您所看到的,.NET调用被阻塞(并在GUI线程上),我怀疑这可能是问题的根源,但我不能使所有调用都变成非阻塞。我本来认为,当操作系统关闭时,所有打开的应用程序窗口都会被终止。
Visual Basic 6.0应用程序从按钮单击加载和显示.NET表单。
如果您在屏幕上显示.NET表单时尝试关闭计算机,将无法成功。"无法退出"消息框看起来 像这样。
要重新创建此操作,您必须将程序集标记为COM可见(在文件
我已成功地在简化的应用程序中重现了这个问题。
.NET代码创建一个WPF窗口,并使用ShowDialog()显示它:
[Guid("5F3D0B23-2196-4082-B9DE-B208C61FE89F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComShutdownTest
{
[DispId(1)]
void RunTest();
}
[Guid("E6613EDD-D51B-42c0-AA5B-5961AB28D063")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ShutdownTest")]
public class ShutdownTest : IComShutdownTest
{
public ShutdownTest()
{ }
public void RunTest()
{
TestWindow testWindow = new TestWindow();
bool? dialogResult = testWindow.ShowDialog();
}
}
正如您所看到的,.NET调用被阻塞(并在GUI线程上),我怀疑这可能是问题的根源,但我不能使所有调用都变成非阻塞。我本来认为,当操作系统关闭时,所有打开的应用程序窗口都会被终止。
Visual Basic 6.0应用程序从按钮单击加载和显示.NET表单。
Private Sub ButtonTest_Click()
LogEventToFile "Starting"
Dim dotNetTestObject As ShutdownTest
LogEventToFile "Creating"
Set dotNetTestObject = New ShutdownTest
LogEventToFile "Running"
dotNetTestObject.RunTest
LogEventToFile "Done"
End Sub
如果您在屏幕上显示.NET表单时尝试关闭计算机,将无法成功。"无法退出"消息框看起来 像这样。
要重新创建此操作,您必须将程序集标记为COM可见(在文件
assemblyinfo.cs
中):[assembly: ComVisible(true)]
你需要在“项目属性-构建”选项卡中设置“注册COM互操作”
我还使用以下方式注册已编译的程序集:
regasm ShutdownTestLibrary.dll /tlb ShutdownTestLibrary.tlb
我该如何解决这个问题?