Вам просто нужно использовать взаимодействие для описания вашей функции GetFactory
, что-то вроде этого
[DllImport("myfakecom.dll")]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object GetFactory();
Тогда, когда у вас есть объект в управляемом коде. Приведение является эквивалентом QueryInterface
void Foo(Object unk)
{
IMyType mytype = (IMyType)unk;
}
Вам нужно будет продублировать определения интерфейса C ++ как определения интерфейса C #, возможно, с атрибутами [marshalas]. Но так как вы уже сделали это, остальное должно быть легко.
Я бы посоветовал вам сменить заводской прототип с
IUnknown * GetFactory();
до
HRESULT GetFactory([out] IUnknown ** ppunk);
Судя по всему, в iterop-коде COM существует сильное предположение о том, что все COM-методы возвращают HRESULT, и будет проще заставить работать маршаллинг, если вы пойдете туда с потоком.