2010-01-19 12 views
7

Quando si definisce una classe COM-visibile in C++ posso definire il modello supportato threading nel file di intestazione (la linea threading(single)):Come contrassegnare gli oggetti .NET esposti a COM-Interop come thread singolo?

[ 
    coclass, 
    default(IComInterface), 
    threading(single), 
    vi_progid("Example.ComClass"), 
    progid("Example.ComClass.1"), 
    version(1.0), 
    uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD") 
] 

Esiste un modo simile di impostare il modello di threading in .NET (per esempio un attributo)? Io attualmente definisco la mia COM-classe come tale:

[Guid("67155A91-2948-43f5-B07F-5C55CDD240E5")] 
[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IComInterface 
{ 
    ... 
} 


[Guid("DC5E6955-BB29-44c8-9FC0-6AADEEB2AFFB")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Example.ComClass")] 
public class ComClass : IComInterface 
{ 
    ... 
} 

--edit:

I commenti sulla risposta marcata sono la cosa veramente importante. Sembra che l'unico modo per dire a RegAsm di impostare un diverso ThreadingModel è quello di scrivere un metodo di registrazione personalizzato contrassegnato con l'attributo [ComRegisterFunction].

risposta

6

Questo è davvero oscuro, non ho mai visto l'attributo "threading" in MIDL. Né lo MSDN Library authors.

Una coclasse COM pubblica i propri requisiti di threading nel registro, utilizzando la chiave HKCR\CLSID\{guid}\InProcServer32. Il valore ThreadingModel dichiara l'appartamento di cui ha bisogno. Se manca o è impostato su "Apartment", viene annunciato che non è thread-safe e richiede l'aiuto di un thread STA. CoCreateInstance() utilizza questo valore quando crea l'oggetto. Se necessario, avvierà un thread STA e creerà un proxy se il thread corrente non è STA, assicurando che venga sempre utilizzato in modalità thread-safe.

Una classe [ComVisible] .NET verrà registrata come "Both", a indicare che è possibile utilizzarla su un thread nel MTA. Piuttosto ottimista, ma segue la filosofia di .NET secondo cui tutto è non sicuro, ma può essere reso sicuro inserendo la parola chiave lock nei punti giusti. Una promessa che non è spesso testata da tempo, rischiosa. Sovrascrivere il valore di ThreadingModel (o ometterlo) richiede la scrittura di codice per registrare la coclasse da soli, decorata con l'attributo [ComRegisterFunction]. RegistrationServices.RegisterTypeForComClients() può essere utile per ottenere le chiavi di base in posizione.

+2

Penso che l'OP non stia parlando degli attributi MIDL. http://msdn.microsoft.com/de-de/library/zfbxt3zs.aspx – Henrik

+0

Hai ragione. Non cambia la mia risposta. –

+0

Ho appena controllato il registro e il valore corrente per ThreadingModel è "Both", che non è quello che sto cercando. Non c'è un altro modo per impostare ThreadingModel oltre a registrare manualmente le classi COM usando un metodo contrassegnato con [ComRegisterFunction]? – Xperimental

Problemi correlati