Я новичок в COM и пытаюсь понять разницу между STA и MTA. Я попытался создать пример, который показал бы, что COM может управлять вызовами к объекту, созданному в STA, который не является потокобезопасным.
MyCalcServer
класс здесь создается с использованием простого объекта ATL. Используемые настройки такие же, как в этой статье :
- Модель резьбы: Квартира
- Агрегация: Нет
- Интерфейс: Пользовательский
MyCalcServer
COM-объект используется в другом проекте C #, а именно:
class Program
{
[STAThread]
static void Main(string[] args)
{
MyCOMLib.MyCalcServer instance = new MyCOMLib.MyCalcServer();
string output1;
instance.ChangeValue("Gant", out output1);
Console.WriteLine(output1);
Thread t1 = new Thread(() =>
{
while (true)
{
string output;
instance.ChangeValue("Gant", out output);
Console.WriteLine(output);
}
});
t1.SetApartmentState(ApartmentState.STA);
t1.Start();
// :
// also has t2 and t3 here with similar code
// :
t1.Join(); t2.Join(); t3.Join();
}
}
Однако это всегда приводит к тому, что InvalidCastException
(E_NOINTERFACE) вызывается внутри кода t1. Я также попытался изменить ApartmentState на MTA безуспешно.
Невозможно привести COM-объект типа
«MyCOMLib.MyCalcServerClass» для
тип интерфейса
'MyCOMLib.IMyCalcServer. это
операция не удалась, потому что
QueryInterface вызов на COM
компонент для интерфейса с IID
'{B005DB8C-7B21-4898-9DEC-CBEBE175BB21}'
не удалось из-за следующей ошибки: Нет
такой интерфейс поддерживается (исключение
от HRESULT: 0x80004002
(E_NOINTERFACE)).
Может кто-нибудь объяснить, что я здесь делаю не так?