#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(), чтобы сначала установить основные ключи на место.