Укажите состояние квартиры для использования при создании экземпляра из COM-объекта proc - PullRequest
5 голосов
/ 20 апреля 2011

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

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

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

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

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

Спасибо!

1 Ответ

3 голосов
/ 20 апреля 2011

ОК, я вставил следующий код в класс, который представлен как 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 от руки не дал того же результата, но мне все равно ...

...