C # Winform COM-взаимодействие и Threading - PullRequest
0 голосов
/ 03 февраля 2012

Я много читаю (снова) о возможности взаимодействия с COM и многопоточности.Что ж, теперь я столкнулся с некоторыми проблемами в понимании следующего сценария.

У меня есть COM Dll, на который ссылаются в VS2008 с именем ComDbLib, и в обозревателе объектов VS2008 я вижу, что он имеет:

  • открытый класс ComDb2Class, который наследует интерфейсы IComDb2, ComDb2, IComDb;
  • открытый интерфейс IComDb2, который наследует интерфейс IComDb;
  • открытый интерфейс ComDb2, который наследует интерфейс IComDb2;
  • открытый интерфейс IComDb;

Выполнение вызова из потока MTA BGWorker к методу, который создает новый объект типа ComDb2Class (ComDb2Class objectDb = new ComDb2Class();), завершается неудачно с хорошо известным исключением:

«Невозможно привести объект COM типа« ComDb2Class »к типу интерфейса« IComDb2 ».Эта операция завершилась неудачно, поскольку не удалось выполнить вызов QueryInterface для компонента COM для интерфейса с IID «XXXXXXXX» из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)). ».

Iнужен BGWorker, поэтому он должен быть частью решения.

Выполнение вызова того же метода, но из потока STA, не является исключением.В любом случае, я хочу избежать этого подхода, потому что мне нужно будет создавать новый поток каждый раз, когда я хочу вызвать этот метод (будут многочисленные вызовы метода, и эти вызовы не локализованы в одном месте в приложении, а распределены поэто), этот подход будет дорогостоящим.

Теперь меня интересует то, что если вы вызываете метод, который создает объект типа (IComDb objectDb = new ComDb2Class();) из потока MTA BGWorker, он не даетлюбое исключение!

Я не могу этого понять, для меня было бы разумно, чтобы исключение возникало из любых вызовов из потока MTA, потому что COM был бы STA и мог быть вызван только в потоке STA.

Черт возьми, я заблудился здесь: s Вы можете объяснить мне, почему конструктор класса потерпел неудачу в первом подходе, а не в последнем ??

...