Предоставление Action или EventHandler из неуправляемого кода

Я работаю с библиотекой кода JEDI, чтобы разместить CLR для использования кода С# в Delphi. Использование TJclClrHost работает очень хорошо для обычных случаев. Однако теперь я нахожусь в ситуации, когда хочу зарегистрироваться на событие в коде С#. Для этого есть несколько вариантов, несколько примеров 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), я не смог найти что-то, что помогло бы в моем случае.


person Florian Koch    schedule 16.01.2020    source источник