Ho un componente esterno (C++), che voglio chiamare dal mio codice C#.C# STAThread COMException
Il codice è qualcosa di simile:
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace dgTEST
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ExtComponentCaller extCompCaller = new ExtComponentCaller();
result = extCompCaller.Call(input);
Thread t = new Thread(new ThreadStart(() =>
{
try
{
result = extCompCaller.Call(input);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
}
}
Quindi il problema è che, alla prima chiamata che sta funzionando bene, il componente esterno chiamato, sono tornato risultato.
Ma quando provo a chiamarlo in un altro thread, ho ottenuto un'eccezione: System.InvalidCastException: impossibile eseguire il cast dell'oggetto COM di tipo 'System .__ ComObject' .... Sono sicuro che questa eccezione è stata lanciata, a causa dello STAThread. Perché se rimuovo l'attributo [STAThread] dalla funzione Main, lo stesso avviene con la prima chiamata del componente esterno, che ha funzionato correttamente.
Come posso chiamare questo componente esterno da un altro thread per eliminare questa eccezione?
UPDATE -------------
Altra cosa folle si verifica ora. Quando avvio il programma da Visual Studio con F5, il problema si verifica anche nella prima chiamata, ma quando eseguo direttamente il file binario .exe, funziona (dall'altro thread non lo è :(). If I commutare la build da Debug per rilasciare e partire da Visual Studio con F5, la prima chiamata a lavorare di nuovo.
Perché succede?
Grazie per voi aiuto in anticipo!
migliori saluti, Zoli
Cosa succede quando si esegue l'intero lavoro (creare un'istanza COM ed eseguire il metodo) in una discussione creata come STA?È possibile che questo oggetto COM sia contrassegnato come STA nel Registro di sistema e non funzioni correttamente tra diversi appartamenti COM (da MTA a STA o da STA a MTA) a causa di un errore nel modo in cui è stato codificato. –
Ho la stessa eccezione :(. Ma la funzione Main è STA, dove viene creato il thread Anche il thread è impostato su STA, quindi non capisco –
Ciò potrebbe essere dovuto a un bug nel componente. tutto è fatto in un singolo thread STA, dovrebbe funzionare –