Я работаю с библиотекой кодов JEDI для размещения CLR для использования кода C# в Delphi. Использование TJclClrHost
это работает довольно хорошо, для общих случаев. Однако сейчас я нахожусь в ситуации, когда я хотел бы зарегистрироваться на событие в C# коде. Для этого есть несколько вариантов, несколько примеров C# -Кода:
public event Action MyEvent;
public event Action<Object> MyEventWithParam;
public event EventHandler MyEventWithHandler;
public event EventHandler<CustomArgs> MyEventWithCustomHandler;
В Delphi я извлекаю MethodInfo для add_MyEvent...
. В зависимости от используемого события я должен передать [mscorlib]System.Action
или [mscorlib]System.EventHandler
. Вопрос в том, как создать соответствующий экземпляр в Delphi? Оба ожидаемых аргумента являются делегатами, поэтому нет конструктора, который я мог бы вызвать для получения экземпляра.
var
instance: OleVariant;
handler: OleVariant;
clrAssembly: TJclClrAssembly;
clrType: _Type;
clrMethod: _MethodInfo;
begin
clrAssembly := ...; // I already have the assembly
clrType := clrAssembly.GetType_2('MyAssembly.MyType');
clrMethod := clrType.GetMethod_6('add_MyEvent');
handler := ???
// instance contains the specific instance of MyClass I want to register the EventHandler on
clrMethod.Invoke_3(instance, PSafeArray(VarArrayAsPSafeArray(VarArrayOf([handler]))))
Хотя я нашел много ресурсов, касающихся передачи обратных вызовов от управляемого к неуправляемому коду (например, этот ответ описывает UnmanagedFunctionPointer
-атрибут, есть также эта статья MSDN , описывающая GetDelegateForFunctionPointer
), я не смог найти то, что поможет в моем случае.