我有一个C ++ COM对象(32位)。这个COM对象调用 一个C#COM对象,作为初始化的一部分,将接口指针(IDispatch)传递给C#。这个想法是C#代码可以回调到C ++ 使用此接口的COM对象。 例: C ++调用C#COM方法 - >
OpenService(...., [..MarshalAs..IDispacth])
我遇到的问题是当C#尝试调用该接口时 我得到MethodNotfound异常。
在内部我声明了一个接口
[Comimport, Guid(...), Interfacetype.Dual]
public interface CallBackInterface
{
void SOData(int data)
}
我将给定的IDispatch指针强制转换为此接口
CallBackInterface cb = (CallbackInterface)inputObject;
cb.SoData(0);
该调用在getIdsOfNames中提供异常NameNotfound。 有趣的是我得到了反射器并尝试调试 来源。异常似乎来自ComEventsSinks.cs 但这不是连接点容器或连接点。 我试图访问调用C ++对象给出的接口。
我放弃并创建了一个简单的ATL COM对象,我尝试了 实现同样的目标,效果很好。我甚至可以 我最终想做的事,CoMarshalInterfaceThreadInStream和 CogetInterfaceandRelease来自后台线程的流,一切都很漂亮。
但由于某种原因,C#甚至无法回复C ++ 原创主题,更不用说我的背景主题了。
我在过去的两三天里摸不着头脑,尝试各种各样的 东西,但这打败了我。
有什么想法吗?指针?也许我在做一些愚蠢和愚蠢的事情?
答案 0 :(得分:2)
IDispatch专为后期绑定或"动态"调度。在这种情况下,您似乎知道COM接口的形状并且已经具有互操作定义(CallBackInterface)。因此,您应该能够使用IUnknown并将InterfaceType设置为InterfaceIsIUnknown而不是IDispatch。
尝试一下,让我们知道它是否有效。
如果没有,并且您确实需要使用IDispatch,那么请确保您的C ++对象正确实现IDispatch(您需要一个类型库和类似ATL的IDispatchImpl)。
希望有所帮助。