Выставить класс как STA COM - PullRequest
4 голосов
/ 19 июля 2010

У меня есть небольшой класс C #, который мне нужно представить как COM.Инструмент, который будет использовать объект COM, требует, чтобы я поддерживал STA.Есть ли что-то особенное, что мне нужно сделать с моим COM-объектом?

(я знаю об атрибуте STAThread, но (если я не ошибаюсь) Это для указания того, что поток выполнения в .netбыть STA-совместимым, а не для указания того, что мой COM-объект должен быть совместимым).

Вот мое объявление до сих пор.Вы видите что-нибудь, что мне нужно добавить?


    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(ITestClass1))]
    [Guid("093A3701-2C53-4A31-97C5-0F3C205E5B4C")]
    public class Class1: ITestClass1 {..}

    [ComVisible(true)]
    [Guid("8D52F785-CDD8-4248-8AB7-97B8C19DE59B")]
    public interface ITestClass1 {..}

Ответы [ 2 ]

7 голосов
/ 19 июля 2010

COM-сервер объявляет требуемую модель потоков с помощью записи реестра с именем ThreadingModel. Однопоточность используется по умолчанию, если раздел реестра отсутствует или для него задано значение «Квартира».

Regasm.exe устанавливает для этого ключа значение «Оба». Это означает, что ваш сервер объявлен совместимым как с потоками STA, так и с потоками MTA. В некоторой степени в соответствии с кодом .NET в целом, он поддерживает многопоточность, но с требованием, чтобы вы заботились о безопасности потоков. Изменить это очень неудобно, вы должны написать собственную процедуру регистрации и аннотировать ее с помощью атрибута [ComRegisterFunction].

Простой подход - оставить ключ установленным в «Both» и проверить состояние квартиры в конструкторе вашего класса. Используйте Thread.GetCurrentThread (). GetApartmentState (). Если вы получаете MTA, то выдайте исключение, чтобы сообщить клиенту, что вы не поддерживает многопоточность. Многие классы .NET делают это.

2 голосов
/ 05 мая 2011

См. этот ответ для примера функции ComRegisterFunction, которая выполняет необходимый реестр voodoo.В некоторых случаях это может потребоваться, например, когда вы хотите убедиться, что ваши потоки являются STA, чтобы вы могли взаимодействовать с другими COM-объектами, которые требуют использования только потоками STA.

...