c# vb6 interop shutdown

c# - La aplicación Visual Basic 6.0 no se cerrará cuando se abra el formulario.NET. En su lugar, muestra el mensaje "No se puede cerrar"



vb6 interop (3)

Podría tratar de tomar la ventana primaria como parámetro para el método .NET , de esta forma se notifica al componente .NET cuando el padre intenta cerrar.

public void RunTest(IWin32Window owner) { TestWindow testWindow = new TestWindow(); bool? dialogResult = testWindow.ShowDialog(owner); }

Y en su código de Visual Basic 6.0:

Call dotNetTestObject.RunTest(Me.hWnd)

Tengo una aplicación de Visual Basic 6.0 que usa varios componentes escritos en .NET . La aplicación se debe cerrar correctamente cuando se cierre Windows. El problema es que si la parte .NET del código muestra una ventana, la aplicación muestra el mensaje "No se puede cerrar " y no puede salir. (Luego es terminado por el sistema operativo).

He logrado reproducir esto en una aplicación simplificada.

El código .NET crea una ventana WPF y la muestra usando 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(); } }

Como puede ver los bloques de llamadas .NET (y está en el hilo de la GUI), y sospecho que esto puede ser el origen del problema, pero no puedo pasar todas las llamadas sin bloqueo. Yo hubiera asumido que cuando el sistema operativo se apaga, todas las ventanas abiertas de la aplicación se terminan.

La aplicación Visual Basic 6.0 carga y muestra el formulario .NET desde un clic de botón.

Private Sub ButtonTest_Click() LogEventToFile "Starting" Dim dotNetTestObject As ShutdownTest LogEventToFile "Creating" Set dotNetTestObject = New ShutdownTest LogEventToFile "Running" dotNetTestObject.RunTest LogEventToFile "Done" End Sub

Si intenta apagar la PC mientras el formulario .NET está en la pantalla, falla. El cuadro de mensaje "No se puede cerrar" tiene este aspecto.

Para volver a crear esto, debe marcar el ensamblaje como COM visible (en el archivo assemblyinfo.cs ):

[assembly: ComVisible(true)]

y debe establecer la pestaña Proyecto-> Propiedades> Crear en "Registrarse para interoperabilidad COM"

También registré el ensamblado compilado con:

regasm ShutdownTestLibrary.dll /tlb ShutdownTestLibrary.tlb

¿Como puedo solucionar este problema?


Si llama a ShowDialog () en cualquier ventana, bloquea esa cadena hasta que se cierre la ventana (del usuario o del código).

Probablemente tendrá que crear un método en su interfaz COM para cerrar la ventana en .NET , o de alguna manera obtener el control de la ventana en Visual Basic para cerrar la ventana.


Uno de los siguientes debe resolver su problema:

  • Asegúrese de que su ventana .NET tenga las propiedades de Texto / Nombre establecidas. Sé que esto causa problemas como este a veces.
  • Establezca el propietario de la ventana .NET en su ventana de Visual Basic. Use la función user32.dll en user32.dll .
  • Enganche en Microsoft.Win32.SystemEvents.SessionEnding en su biblioteca de .NET y cierre la ventana.