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 が正常に取得されますが、ユーザー定義のメソッドは含まれていません。代わりに、6 つの既定の IDispatch メソッド (QueryInterface、GetTypeInfo など) のみが含まれています。前の例の「Hello」など、定義済みのメソッドを取得できる必要があります。

このアセンブリからユーザー定義メソッドを含む IDispatch を取得するにはどうすればよいですか?

4

1 に答える 1

0

IDispatchGetIDsOfNamesインターフェイスには、 、GetTypeInfoGetTypeInfoCountおよびの 4 つのメソッドのみが含まれますInvoke。各コンポーネントが異なるIDispatch場合、それは単一のインターフェースではないでしょうか?

IDispatchイントロスペクション、つまり実行時に型に関するメタデータを検索する機能をサポートする、動的なレイト バインド メソッド実行用のインターフェイスです。サポートされているメソッドとプロパティのリストを動的に検索し、それらを動的に呼び出す方法を提供します。これは、これらのメソッドがインターフェイス自体の一部ではないことを意味します。代わりに、上記の最初の 3 つのメソッドを介してそれらを列挙し、Invoke.

于 2015-07-15T21:51:52.803 に答える