При вызове Marshal.GetActiveObject (идентификатор класса здесь) что может вызвать ошибку 800401E3 (операция недоступна)?

У нас есть сценарий, в котором некоторый .NET-код пытается получить доступ к текущему экземпляру объекта COM (фактически DCOM).

Доступ к объекту был разработан на языке VB6. Текущий его экземпляр доступен в удаленной системе и, похоже, правильно доступен из кода VB6.

Попытка вызвать Marshal.GetActiveObject с указанием имени класса вызывает исключение COMException со ссылкой на ошибку 800401E3 (операция недоступна).

Тот же самый код .NET работает правильно при запуске на компьютере, на котором размещен этот компонент DCOM.

Может ли кто-нибудь предложить, почему создается это COMException?


person Richard J Foster    schedule 30.06.2009    source источник


Ответы (1)


Вы пытались использовать атрибут [STAThread] в клиентском приложении dot net?

person Ron Klein    schedule 16.07.2009
comment
Поскольку клиентское приложение .NET является приложением WinForms, оно имеет атрибут STAThread. Однако вызов GetActiveObject находится в DLL, а это не так. Я добавил проверку непосредственно перед вызовом GetActiveObject, чтобы убедиться, что поток, вызывающий метод DLL, использует STA. На данный момент кажется, что никаких вызовов метода из приложения с неподдерживаемым режимом потоковой передачи не производилось. - person Richard J Foster; 21.07.2009
comment
Похоже, ты что-то понял. Теперь мы подтвердили, что есть еще один клиент, который вызывает DLL из потока MTA. - person Richard J Foster; 21.07.2009
comment
Хотя мы все еще иногда сталкиваемся с этой проблемой, кажется, что она почти наверняка связана с потоком. В результате я устанавливаю этот ответ как правильный, хотя может все еще существовать другой сценарий, вызывающий тот же симптом. - person Richard J Foster; 10.08.2009