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