При определении COM-видимого класса в C++ я могу определить поддерживаемую модель потоков в заголовочном файле ( threading(single)
строка):
[
coclass,
default(IComInterface),
threading(single),
vi_progid("Example.ComClass"),
progid("Example.ComClass.1"),
version(1.0),
uuid("72861DF5-4C77-43ec-A4DC-ED04396F0CCD")
]
Существует ли сопоставимый способ установить модель потоков в.NET (например, атрибут)? Я в настоящее время определяю свой COM-класс как таковой:
[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
{
...
}
править:
Комментарии к отмеченному ответу являются действительно важной вещью. Это походит на единственный способ сказать, что RegAsm для установки другого ThreadingModel должен записать пользовательский регистрационный метод, отмеченный с [ComRegisterFunction]
атрибут.
Это действительно Неясным, я никогда не видел атрибут «Threading» в MIDL. И не имеют авторов MSDN-библиотеки .
COM Coclass публикует его потребности в резьбе в реестре, используя клавишу HKCR \ CLSID \ {GUID} \ inprocserver32
. Значение ThreadingModel заявляет о своей квартире. Если оно отсутствует или устанавливается на «квартиру», то это объявляет, что это не безопасно в потоке и требует помощи в потоке STA. CoCreateInstance () использует это значение, когда оно создает объект. При необходимости он начнет потоку STA и создать прокси, если текущий нить не является STA, обеспечивая его всегда использовать в потоке.
Класс [ComVisible] .NET будет зарегистрирован как «Оба», указывая на то, что он будет использоваться в потоке в MTA. Довольно оптимистично, но следует .NET Philosophy, что все небезопасно, но может быть сделано безопасно, надевая ключевое слово в нужных местах
в нужных местах. Обещание, которое не часто проверяется, кстати, рискованно. Переопределение значения ThreadingModel (или их пропуская) требует записи кода для регистрации Coclass самостоятельно, украшенного атрибутом [comregisterfunction]. Регистрация. Регистрация. MegistertyPeforCoClients () может быть полезен для получения основных ключей на место.