Как отметить объекты.NET, выставленные взаимодействующему с COM, поскольку единственный распараллелил?

При определении 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]атрибут.

7
задан Xperimental 28 January 2010 в 11:42
поделиться

1 ответ

Это действительно Неясным, я никогда не видел атрибут «Threading» в MIDL. И не имеют авторов MSDN-библиотеки .

COM Coclass публикует его потребности в резьбе в реестре, используя клавишу HKCR \ CLSID \ {GUID} \ inprocserver32 . Значение ThreadingModel заявляет о своей квартире. Если оно отсутствует или устанавливается на «квартиру», то это объявляет, что это не безопасно в потоке и требует помощи в потоке STA. CoCreateInstance () использует это значение, когда оно создает объект. При необходимости он начнет потоку STA и создать прокси, если текущий нить не является STA, обеспечивая его всегда использовать в потоке.

Класс [ComVisible] .NET будет зарегистрирован как «Оба», указывая на то, что он будет использоваться в потоке в MTA. Довольно оптимистично, но следует .NET Philosophy, что все небезопасно, но может быть сделано безопасно, надевая ключевое слово в нужных местах в нужных местах. Обещание, которое не часто проверяется, кстати, рискованно. Переопределение значения ThreadingModel (или их пропуская) требует записи кода для регистрации Coclass самостоятельно, украшенного атрибутом [comregisterfunction]. Регистрация. Регистрация. MegistertyPeforCoClients () может быть полезен для получения основных ключей на место.

6
ответ дан 7 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: