IAsyncStateMachineAdaptor.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using ILRuntime.CLR.Method;
  4. using ILRuntime.Runtime.Enviorment;
  5. using ILRuntime.Runtime.Intepreter;
  6. using AppDomain = ILRuntime.Runtime.Enviorment.AppDomain;
  7. namespace ET
  8. {
  9. /// <summary>
  10. /// 用于async await适配
  11. /// </summary>
  12. public class IAsyncStateMachineClassInheritanceAdaptor: CrossBindingAdaptor
  13. {
  14. public override Type BaseCLRType => typeof (IAsyncStateMachine);
  15. public override Type AdaptorType => typeof (IAsyncStateMachineAdaptor);
  16. public override object CreateCLRInstance(AppDomain appdomain, ILTypeInstance instance)
  17. {
  18. return new IAsyncStateMachineAdaptor(appdomain, instance);
  19. }
  20. public class IAsyncStateMachineAdaptor: IAsyncStateMachine, CrossBindingAdaptorType
  21. {
  22. private readonly ILTypeInstance instance;
  23. private readonly AppDomain appDomain;
  24. private readonly IMethod mMoveNext;
  25. private readonly IMethod mSetStateMachine;
  26. public IAsyncStateMachineAdaptor()
  27. {
  28. }
  29. public IAsyncStateMachineAdaptor(AppDomain appDomain, ILTypeInstance instance)
  30. {
  31. this.appDomain = appDomain;
  32. this.instance = instance;
  33. mMoveNext = instance.Type.GetMethod("MoveNext", 0);
  34. mSetStateMachine = instance.Type.GetMethod("SetStateMachine");
  35. }
  36. public ILTypeInstance ILInstance => instance;
  37. public void MoveNext()
  38. {
  39. this.appDomain.Invoke(mMoveNext, instance, null);
  40. }
  41. public void SetStateMachine(IAsyncStateMachine stateMachine)
  42. {
  43. this.appDomain.Invoke(mSetStateMachine, instance, stateMachine);
  44. }
  45. public override string ToString()
  46. {
  47. IMethod m = this.appDomain.ObjectType.GetMethod("ToString", 0);
  48. m = instance.Type.GetVirtualMethod(m);
  49. if (m == null || m is ILMethod)
  50. {
  51. return instance.ToString();
  52. }
  53. return instance.Type.FullName;
  54. }
  55. }
  56. }
  57. }