title: Exception from DynamicMethod.CreateDelegate, almost identical MSDN example
body: <p>When i call CreateDelegate(delegateType) i get a <code>System.ArgumentException</code>, which according to MSDN is because the delegateType has the wrong number of parameters or the wrong parameter types.</p>
  
  <p>The strange part is the code I'm using is almost all copied from MSDN. My function as whole:</p>
  
  <pre><code>public static void AssertRaisesEvent(Action action, object obj, string eventName, NumberOfTimes numberOfTimesRaised)
  {
      eventCounter = 0;
      EventInfo eventInfo = obj.GetType().GetEvent(eventName);
      Type tDelegate = eventInfo.EventHandlerType;
  
      Type returnType = GetDelegateReturnType(tDelegate);
      if (returnType != typeof(void))
          throw new ApplicationException("Delegate has a return type.");
  
      var handler =
          new DynamicMethod("CompletedHandler",
              typeof(int),
              GetDelegateParameterTypes(tDelegate),
              obj.GetType());
  
      // Generate a method body. This method loads a string, calls 
      // the Show method overload that takes a string, pops the 
      // return value off the stack (because the handler has no
      // return type), and returns.
      //
      ILGenerator ilgen = handler.GetILGenerator();
      FieldInfo counterFieldInfo = typeof (AssertionHelpers).GetField("eventCounter",
                                                                      BindingFlags.NonPublic | BindingFlags.Static);
      ilgen.Emit(OpCodes.Ldfld, counterFieldInfo);
      ilgen.Emit(OpCodes.Ldc_I4, 1);
      ilgen.Emit(OpCodes.Add);
      ilgen.Emit(OpCodes.Pop);
      ilgen.Emit(OpCodes.Ret);
  
      // Complete the dynamic method by calling its CreateDelegate
      // method. Use the "add" accessor to add the delegate to
      // the invocation list for the event.
      //
  
      var delParams = GetDelegateParameterTypes(tDelegate);
      var handlerParams = handler.GetParameters();
  
      Delegate dEmitted = handler.CreateDelegate(tDelegate);
      eventInfo.GetAddMethod().Invoke(obj, new Object[] { dEmitted });
  
      ...
  </code></pre>
  
  <p>As you can see the comments are even there. As you also can see i have delParams and handlerParams variables which have the same number of parameters of the same type.</p>
  
  <p>What is going on here?</p>
  
  <p>MSDN: <a href="http://msdn.microsoft.com/en-us/library/ms228976.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms228976.aspx</a></p>
  
  <p>EDIT:
  The event im trying to bind to:</p>
  
  <pre><code>private NullTransaction transaction;
  
  public delegate void CompletedEventHandler(object testParam);
  
  internal class NullTransaction : ITransaction
  {
  public event CompletedEventHandler Completed;
      public void Dispose()
      {
          // no implementation
      }
  
      public void Complete()
      {
          // no implementation
      if(Completed != null)
              Completed.Invoke(this);
      }
  }
  </code></pre>