0

因此,我正在处理的程序从用户输入文本编辑器(使用 CodeDOM 作为编译器)的源代码创建一个动态的 .Net 程序集。我需要为这个程序集获取一个包含所有用户定义方法的 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?

4

1 回答 1

0

IDispatch接口仅包含四个方法:GetIDsOfNamesGetTypeInfo和。如果每个组件都不同,那么它就不会是一个单一的接口,不是吗?GetTypeInfoCountInvokeIDispatch

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

于 2015-07-15T21:51:52.803 回答