Предоставление Action или EventHandler из неуправляемого кода - PullRequest
2 голосов
/ 16 января 2020

Я работаю с библиотекой кодов 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), я не смог найти то, что поможет в моем случае.

...