我有一个Visual Basic 6.0应用程序,它使用了几个用.NET编写的组件。当 Windows 关闭时,应用程序必须正常关闭。问题是,如果代码的 .NET 部分显示一个窗口,应用程序会显示消息“无法退出”并且无法退出。(然后由操作系统终止。)
我设法在一个简化的应用程序中重现了这一点。
.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 表单时尝试关闭 PC,则会失败。“无法退出”消息框如下所示。
要重新创建它,您必须将程序集标记为COM可见(在文件中assemblyinfo.cs
):
[assembly: ComVisible(true)]
并且您必须将 Project->Properties>Build 选项卡设置为“Register for COM interop”
我还注册了编译的程序集:
regasm ShutdownTestLibrary.dll /tlb ShutdownTestLibrary.tlb
我该如何解决这个问题?