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

Get User-Defined Methods from IDispatch for Dynamic Assembly

所以我正在处理的程序从用户输入文本编辑器(使用 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?

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

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

执行它们