Sono nuovo a COM e sto cercando di capire la differenza tra STA e MTA. Ho provato a creare un esempio che mostra che COM può gestire le chiamate all'oggetto creato in STA che non è thread-safe.Impossibile chiamare l'oggetto COM creato da STAThread da altri thread STA
MyCalcServer
classe qui creata utilizzando Oggetto semplice ATL. Le impostazioni utilizzate sono le stesse in this article:
- modello di threading: Appartamento
- Aggregazione: No
- Interfaccia: personalizzato
MyCalcServer
oggetto COM viene utilizzato in un altro progetto C# che è:
Tuttavia, questo risulta sempre in InvalidCastException
(E_NOINTERFACE) generato all'interno del codice t1. Ho anche provato a cambiare ApartmentState in MTA senza successo.
Unable to cast COM object of type 'MyCOMLib.MyCalcServerClass' to interface type 'MyCOMLib.IMyCalcServer'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{B005DB8C-7B21-4898-9DEC-CBEBE175BB21}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
Qualcuno potrebbe spiegare cosa sto facendo male qui?
Forse il JIT pensa che tu non stia usando "istanza" e lo rilasci in anticipo. prova a mettere Marshal.ReleaseComObject (istanza) dopo i join. – adrianm
@adrianm Ancora non funziona, ma grazie per questo – Gant
Prova a cambiare la prima riga in MyCOMLib.IMyCalcServer instance = new MyCOMLib.MyCalcServer(); Penso che solo le interfacce (non le classi) possono essere inserite tra i thread. – adrianm