Укажите состояние квартиры, которое будет использоваться при создании экземпляра из proc COM-объекта

#c# #.net #com #com

#c# #.net #com #com

Вопрос:

Я создал COM-объект в .NET и зарегистрировал его как серверное приложение COM с объединением в пул = 1, используя regsvcs . В настоящее время я выслеживаю ошибку, и поэтому мне нужно убедиться, что этот COM-объект запущен в STA, а не в MTA. Как я могу это указать?
Любое из следующих действий поможет мне:

  • Настройка в оснастке служб компонентов
  • Параметр / фрагмент кода, который позволяет COM-объекту разрешать только STA, а не оба
  • Параметр / фрагмент кода в C # на стороне вызывающей стороны, который сообщает COM , что COM-объект должен быть инициализирован с помощью STA

Обновление:
Я попытался вручную изменить ThreadingModel запись в реестре с Both на Apartment . Это тоже не помогло, потому что когда я пытаюсь создать экземпляр COM-объекта, я получаю COMException (0x80110802) и средство просмотра событий сообщает:

Потоковая модель компонента, указанная в реестре, несовместима с базой данных регистрации. Неисправным компонентом является: < MyComponent >

Есть ли какое-либо другое место, где мне нужно изменить модель потоков? Например, в этой «базе данных регистрации»? Где я могу это найти?

Спасибо!

Ответ №1:

Хорошо, я вставил следующий код в класс, который представлен как COM-объект, и, похоже, он работает:

 [ComRegisterFunction]
private static void Register(Type registerType)
{
    if (registerType != null)
    {
        using (RegistryKey clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID"))
        {
            using (RegistryKey guidKey = clsidKey.OpenSubKey(registerType.GUID.ToString("B"), true))
            {
                using (RegistryKey inproc = guidKey.OpenSubKey("InprocServer32", true))
                {
                    inproc.SetValue("ThreadingModel", "Apartment", RegistryValueKind.String);
                }
            }
        }
    }
}
  

Я совсем не понимаю, почему изменение ThreadingModel вручную не дало того же результата, но мне все равно…

Комментарии:

1. Недостаточно хорошо, работает только в том случае, если coclass был зарегистрирован ранее. Рассмотрим службы регистрации. RegisterTypeForComClients(), чтобы сначала установить основные ключи на место.