У меня есть Visual Basic 6.0 приложение, которое использует несколько компонентов, написанных на .NET . Приложение должно корректно завершать работу при закрытии окон. Проблема заключается в том, что если в .NET-части кода отображается окно, приложение отображает сообщение «Cannot Quit» и не может выйти. (Затем завершается ОС.)
Мне удалось воспроизвести это в упрощенном приложении.
.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 (и в потоке графического интерфейса), и я подозреваю, что это может быть причиной проблемы, но я не могу сделать все мои вызовы неблокирующими. Я бы предположил, что, когда ОС закрывается, все открытые окна приложений закрываются.
Приложение 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
Как я могу решить эту проблему?