Pregunta

Tengo que incluir una aplicación de .NET en otra aplicación .NET como un plugin. La interfaz de complementos me obliga a heredar de una forma de la plantilla. La forma se fija entonces en un MDI cuando se carga el plugin.

Todo está funcionando hasta ahora, pero cada vez que me registro para arrastrarlo eventos, establecer el modo de autocompletar para un cuadro combinado o en varias otras situaciones que recibo la siguiente excepción:

  

... el subproceso actual se debe establecer en   apartamento individual hilo modo (STA)   antes de poder hacer llamadas OLE. Asegurar   que su función principal tiene   STAThreadAttribute marcado en él ...

La principal aplicación se está ejecutando en el MTA y desarrollado por otra compañía, por lo que no hay nada que pueda hacer al respecto.

He intentado hacer las cosas que causan estas excepciones en subprocesos STA, pero eso no resuelve el problema.

¿Alguien ha estado en la misma situación? ¿Hay algo que pueda hacer para resolver el problema?

¿Fue útil?

Solución 3

Actualización: La compañía lanzó una nueva versión STA. La pregunta ya no es relevante.

Otros consejos

Se podría tratar de generar nuevo hilo y llamar a CoInitialize con 0 en él (Aparment roscados) y ejecutar la aplicación en este hilo. Sin embargo no será para actualizar los controles directamente dentro de este hilo que debe utilizar Control.Invoke para cada modificación de interfaz de usuario.

No sé si esto va a funcionar con seguridad, pero que podía probarlo.

Hace poco me encontré con este problema a mí mismo al intentar leer las imágenes de una cámara web. Lo que terminé haciendo fue la creación de un método que dio lugar a un nuevo subproceso STA, en el que se ejecutó el método de un solo hilo.

El problema

private void TimerTick(object sender, EventArgs e)
{
   // pause timer
   this.timer.Stop();

        try
        {
            // get next frame
            UnsafeNativeMethods.SendMessage(this.captureHandle, WindowsMessageCameraGetFrame, 0, 0);

            // copy frame to clipboard
            UnsafeNativeMethods.SendMessage(this.captureHandle, WindowsMessageCameraCopy, 0, 0);

            // notify event subscribers
            if (this.ImageChanged != null)
            {
                IDataObject imageData = Clipboard.GetDataObject();

                Image image = (Bitmap)imageData.GetData(System.Windows.Forms.DataFormats.Bitmap);

                this.ImageChanged(this, new WebCamEventArgs(image.GetThumbnailImage(this.width, this.height, null, System.IntPtr.Zero)));
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error capturing the video\r\n\n" + ex.Message);
            this.Stop();
        }
    }
   // restart timer
   Application.DoEvents();

   if (!this.isStopped)
   {
      this.timer.Start();
   }
}

La solución:. Mover la lógica de un solo hilo a su propio método, y llamar a este método de un nuevo hilo STA

private void TimerTick(object sender, EventArgs e)
{
    // pause timer
    this.timer.Stop();

    // start a new thread because GetVideoCapture needs to be run in single thread mode
    Thread newThread = new Thread(new ThreadStart(this.GetVideoCapture));
    newThread.SetApartmentState(ApartmentState.STA);
    newThread.Start();

    // restart timer
    Application.DoEvents();

    if (!this.isStopped)
    {
        this.timer.Start();
    }
}

/// <summary>
/// Captures the next frame from the video feed.
/// This method needs to be run in single thread mode, because the use of the Clipboard (OLE) requires the STAThread attribute.
/// </summary>
private void GetVideoCapture()
{
    try
    {
        // get next frame
        UnsafeNativeMethods.SendMessage(this.captureHandle, WindowsMessageCameraGetFrame, 0, 0);

        // copy frame to clipboard
        UnsafeNativeMethods.SendMessage(this.captureHandle, WindowsMessageCameraCopy, 0, 0);

        // notify subscribers
        if (this.ImageChanged!= null)
        {
            IDataObject imageData = Clipboard.GetDataObject();

            Image image = (Bitmap)imageData.GetData(System.Windows.Forms.DataFormats.Bitmap);

            // raise the event
            this.ImageChanged(this, new WebCamEventArgs(image.GetThumbnailImage(this.width, this.height, null, System.IntPtr.Zero)));
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error capturing video.\r\n\n" + ex.Message);
        this.Stop();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top