【问题标题】:Get User-Defined Methods from IDispatch for Dynamic Assembly从 IDispatch 获取用户定义的方法以进行动态装配
【发布时间】:2015-10-05 03:07:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-27
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多