从IDispatch获取用户定义的方法以进行动态组装

时间:2015-07-15 21:10:58

标签: .net visual-c++ dynamic com idispatch

因此,我正在开发的程序从源代码创建一个动态.Net程序集,用户将其输入文本编辑器(使用CodeDOM作为编译器)。我需要为包含所有用户定义方法的程序集获取IDispatch。

例如,用户可以输入:

Imports System.Windows.Forms
Public Class Test
    Function Hello
        MessageBox.Show("Hello, World!")
    End Function
End Class

这会创建一个我可以引用的内存中程序集。我用来获取IDispatch的代码:

//"file" the pointer to the in-memory assembly, "name" is the name of the type being created
HRESULT ScriptEngine::GetDispatch(void** disp) {
    Object^ component = file->CreateInstance(name);
    if (file != nullptr) {
        *disp = Marshal::GetIDispatchForObject(component).ToPointer();
        return S_OK;
    else
        return E_FAIL;
}

这为我成功获取了一个IDispatch,但它不包含任何用户定义的方法。相反,它只包含六个默认的IDispatch方法(QueryInterface,GetTypeInfo等)。我需要能够获得已定义的方法,例如前面示例中的“Hello”。

如何从此程序集中获取包含用户定义方法的IDispatch?

1 个答案:

答案 0 :(得分:0)

IDispatch界面只包含四种方法:GetIDsOfNamesGetTypeInfoGetTypeInfoCountInvoke。如果每个组件都有不同的IDispatch那么它就不是一个单独的接口,是吗?

IDispatch是动态后期绑定方法执行的接口,它支持内省,即在运行时查找有关类型的元数据的能力。它提供了一种动态查找受支持的方法和属性列表并动态调用它们的方法。这意味着这些方法不是接口本身的一部分:相反,您可以通过上面列出的前三种方法枚举它们,并通过Invoke执行它们。