C # — использование интерфейса COM вызывает InvalidCastException параллельно foreach

Мне нужен цикл C # для повторного вызова функции COM-объекта. Однопоточный работает, но параллельная версия бросает …

foreach (Stub stub in inputStubs) { dc.Work(stub); }   // ok

Parallel.ForEach(inputStubs, stub => dc.Work(stub) ); // throws

В обоих случаях я могу достичь точки останова внутри Work (), чтобы она вызывалась. Исключение по-прежнему возникает, когда все функции в Work () закомментированы. Исключение выглядит так:

Exception thrown: 'System.InvalidCastException' in my.dll

Additional information: Unable to cast COM object of type 'System.__ComObject'
to interface type 'my.IDC'. This operation failed because the QueryInterface
call on the COM component for the interface with IID
'{99E2873B-4042-4F24-A680-2882E4C869DD}' failed due to the following error:
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Определение C # для COM-объекта начинается следующим образом.

[ComImport, Guid("99E2873B-4042-4F24-A680-2882E4C869DD"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
SuppressUnmanagedCodeSecurity()]
public interface IDC
{

На стороне C ++ все это сводится к

interface __declspec(uuid("99E2873B-4042-4F24-A680-2882E4C869DD"))
IDC : IUnknown
{

а также

class CDC : public IDC
{
private:
LONG refcount;

public:

CDC() { refcount = 1; }
virtual ~CDC() {}

virtual HRESULT __stdcall QueryInterface(REFIID riid, void** p)
{
if(riid == __uuidof(IUnknown)) { *p = static_cast<IUnknown*>(this); AddRef(); return 0; }
if(riid == __uuidof(IDC))          { *p = static_cast<T*>(this);   AddRef(); return 0; }
return E_NOINTERFACE;
}

virtual ULONG __stdcall AddRef()
{
return InterlockedIncrement(&refcount);
}

virtual ULONG __stdcall Release()
{
ULONG count = InterlockedDecrement(&refcount);
if(!count)
delete this;
return count;
}

Что может быть причиной этого?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]