IAsyncStateMachineAdaptor.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 ILTypeInstance instance;
  23. private AppDomain appDomain;
  24. private IMethod mMoveNext;
  25. private IMethod mSetStateMachine;
  26. private readonly object[] param1 = new object[1];
  27. public IAsyncStateMachineAdaptor()
  28. {
  29. }
  30. public IAsyncStateMachineAdaptor(AppDomain appDomain, ILTypeInstance instance)
  31. {
  32. this.appDomain = appDomain;
  33. this.instance = instance;
  34. }
  35. public ILTypeInstance ILInstance => instance;
  36. public void MoveNext()
  37. {
  38. if (this.mMoveNext == null)
  39. {
  40. mMoveNext = instance.Type.GetMethod("MoveNext", 0);
  41. }
  42. this.appDomain.Invoke(mMoveNext, instance, null);
  43. }
  44. public void SetStateMachine(IAsyncStateMachine stateMachine)
  45. {
  46. if (this.mSetStateMachine == null)
  47. {
  48. mSetStateMachine = instance.Type.GetMethod("SetStateMachine");
  49. }
  50. this.appDomain.Invoke(mSetStateMachine, instance, stateMachine);
  51. }
  52. public override string ToString()
  53. {
  54. IMethod m = this.appDomain.ObjectType.GetMethod("ToString", 0);
  55. m = instance.Type.GetVirtualMethod(m);
  56. if (m == null || m is ILMethod)
  57. {
  58. return instance.ToString();
  59. }
  60. return instance.Type.FullName;
  61. }
  62. }
  63. }
  64. }