È necessario utilizzare un controllo ActiveX di terze parti.Controllo ActiveX senza modulo
L'unico problema è che il livello del nostro software è un livello aziendale e non ha accesso a finestre o moduli. Funziona anche su thread separati (e dovrebbe funzionare da qualsiasi thread) che non sono STA.
Invece di rompere la nostra separazione della UI da logica di business, abbiamo usato questa soluzione per farlo funzionare:
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Poi ogni volta che abbiamo bisogno di fare riferimento al controllo, lo chiamiamo _myActiveX.BeginInvoke()
o Invoke()
.
Allo smaltimento di questa classe (uscendo dalla nostra app), disponiamo il controllo e interrompiamo la discussione.
La mia domanda è, ci sono problemi con questo? C'è un modo migliore per gestire questo?
Esiste un modo migliore di lavorare con un controllo ActiveX all'interno di un ambiente multi-thread sconosciuto? Stiamo cercando di scrivere la nostra classe in un modo che comprenda il controllo ma funzionerà da qualsiasi thread.
AGGIORNAMENTO: Come suggerito, preferiremmo utilizzare l'oggetto COM standard e non utilizzare affatto un controllo. Il nostro problema è stato che avremmo ricevuto l'errore "(Eccezione da HRESULT: 0x8000FFFF (E_UNEXPECTED)" sul primo metodo o proprietà che chiamiamo sull'oggetto COM. Questo è un errore piuttosto generico che non si ottiene quando si utilizza ActiveX , qualsiasi idea?
AGGIORNAMENTO: Il nostro ocx è "CX25.ocx", utilizzando tlbimp.exe otteniamo CX25Lib.dll. Utilizzando aximp.exe, otteniamo AxCX25Lib.dll e CX25Lib.dll. CX25Lib.dll non funziona AxCX25Lib.dll funziona
Il codice sopra menzionato funziona. Qualcuno ha dovuto utilizzare un controllo ActiveX senza un modulo? O qualcuno ha avuto problemi usando l'oggetto COM standard, ma notato che ActiveX funziona? – jonathanpeppers
Hai trovato una soluzione per questo? Sospetto che l'approccio corretto dipenda dal fatto che si aspettino o meno callback/eventi dal controllo in quanto dipenderebbe da un pump dei messaggi di Windows per gestirli. – Tormod
Sì, il codice sopra funziona. Lo stiamo usando da oltre un anno senza problemi. Lo usiamo anche con più librerie COM. Abbiamo finito con il wrapping in una classe e abbiamo implementato Invoke/BeginInvoke per interagire con il controllo, che è richiesto. – jonathanpeppers