Получите пользовательские методы из 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 ответ

Решение

IDispatch Интерфейс содержит только четыре метода: GetIDsOfNames, GetTypeInfo, GetTypeInfoCount а также Invoke, Если бы каждый компонент имел разные IDispatch тогда это был бы не единственный интерфейс, не так ли?

IDispatch это интерфейс для динамического выполнения метода с поздним связыванием, который поддерживает самоанализ, то есть возможность находить метаданные о типе во время выполнения. Он позволяет динамически находить список поддерживаемых методов и свойств и динамически вызывать их. Это означает, что эти методы не являются частью самого интерфейса: вместо этого вы можете перечислить их с помощью первых трех методов, перечисленных выше, и выполнить их с помощью Invoke,

Другие вопросы по тегам