2010-01-19 11 views
7

Przy określaniu klasy COM-widoczne w C++ można zdefiniować obsługiwanego modelu wątków w pliku nagłówkowym (linia threading(single)):Jak oznaczać obiekty .NET narażone na COM-interop jako pojedyncze wątki?

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

Czy istnieje porównywalny sposób ustalania modelu wątków w .NET (dla przykładowy atrybut)? I obecnie określić mój COM klasy jako takie:

[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:

Uwagi dotyczące zaznaczonej odpowiedzi są naprawdę ważne. Wygląda na to, że jedynym sposobem na poinformowanie RegAsm o ustawieniu innego ThreadingModel jest napisanie niestandardowej metody rejestracji oznaczonej atrybutem [ComRegisterFunction].

Odpowiedz

6

To jest naprawdę niejasne, nigdy nie widziałem atrybutu "threading" w MIDL. Nie ma również MSDN Library authors.

Koktajl COM publikuje swoje wymagania dotyczące gwintowania w rejestrze za pomocą klucza HKCR\CLSID\{guid}\InProcServer32. Wartość ThreadingModel deklaruje mieszkanie, którego potrzebuje. Jeśli go nie ma lub jest ustawione na "Apartament", to informuje, że nie jest bezpieczne dla wątków i wymaga pomocy z wątku STA. CoCreateInstance() używa tej wartości, gdy tworzy obiekt. Jeśli to konieczne, uruchomi wątek STA i utworzy proxy, jeśli bieżący wątek nie jest STA, zapewniając, że jest zawsze używany w sposób bezpieczny dla wątków.

Klasa [ComVisible] .NET zostanie zarejestrowana jako "Obie", co oznacza, że ​​można używać jej w wątku w MTA. Całkiem optymistyczny, ale zgodny z filozofią .NET, że wszystko jest niebezpieczne z punktu widzenia wątku, ale można go zabezpieczyć, umieszczając słowo kluczowe lock we właściwych miejscach. Obietnica, która często nie jest testowana, ryzykowna. Przesłanianie wartości ThreadingModel (lub pomijanie jej) wymaga napisania kodu w celu zarejestrowania samej coclass ozdobionej atrybutem [ComRegisterFunction]. RegistrationServices.RegisterTypeForComClients() może być użyteczne, aby uzyskać podstawowe klucze na miejscu.

+2

Myślę, że OP nie mówi o atrybutach MIDL. http://msdn.microsoft.com/de-de/library/zfbxt3zs.aspx – Henrik

+0

Masz rację. To nie zmienia mojej odpowiedzi. –

+0

Właśnie sprawdziłem rejestr, a obecna wartość dla ThreadingModel to "Both", której nie szukam. Czy nie ma innego sposobu na ustawienie ThreadingModel oprócz ręcznej rejestracji klas COM przy użyciu metody oznaczonej [ComRegisterFunction]? – Xperimental

Powiązane problemy