[Mono-bugs] [Bug 656918] New: Unexpected "method argument length mismatch" in System.Delegate.CreateDelegate

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Wed Dec 1 15:54:10 EST 2010


https://bugzilla.novell.com/show_bug.cgi?id=656918

https://bugzilla.novell.com/show_bug.cgi?id=656918#c0


           Summary: Unexpected "method argument length mismatch" in
                    System.Delegate.CreateDelegate
    Classification: Mono
           Product: Mono: Runtime
           Version: 2.6.x
          Platform: Macintosh
        OS/Version: Mac OS X 10.6
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: misc
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: dmoles.work at gmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


User-Agent:       Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US)
AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7

I've got a class A that calls a method on interface B, passing to it one of its
own methods as sort of a continuation that B is supposed to call when it has a
result. The code seems to work fine in practice, but testing it with Moq
4.0.10827, targeting Mono/.NET 3.5, produces the stack trace below.

A correspondent on StackOverflow (see
http://stackoverflow.com/questions/4328075/moq-verifying-a-method-was-called-with-a-particular-delegate-produces-method-ar)
ran the code with MS .NET and it worked fine, so it looks like a bug (or at
least an incompatibility) in Mono.

Reproducible: Always

Steps to Reproduce:
1. Run the unit test below.

public class A
{
    readonly B myB;

    public A (B b)
    {
        myB = b;
    }

    public void HandleC (C c)
    {
        // do something
    }

    public void DoFindC ()
    {
        myB.FindC (HandleC);
    }
}

public interface B
{
    // Finds a C and then passes it to handleC
    void FindC (Action<C> handleC);
}

public interface C
{
}

[TestFixture()]
public class ATest
{
    [Test()]
    public void TestDoFindC ()
    {
        Mock<B> bMock = new Mock<B> ();
        A a = new A(bMock.Object);
        a.DoFindC();

        bMock.Verify(b => b.FindC(a.HandleC));
    }
}
Actual Results:  
Test fails with the following stack trace:

System.ArgumentException : method argument length mismatch

at System.Delegate.CreateDelegate
(System.Type,object,System.Reflection.MethodInfo,bool) <IL 0x002db, 0x00624>
at System.Delegate.CreateDelegate
(System.Type,object,System.Reflection.MethodInfo) <IL 0x00004, 0x00015>
at (wrapper dynamic-method)
System.Runtime.CompilerServices.ExecutionScope.lambda_method
(System.Runtime.CompilerServices.ExecutionScope) <IL 0x00015, 0x00079>
at Moq.MatcherFactory.CreateMatcher (System.Linq.Expressions.Expression,bool)
<IL 0x0008e, 0x0018e>
at Moq.MethodCall..ctor
(Moq.Mock,System.Func`1<bool>,System.Linq.Expressions.Expression,System.Reflection.MethodInfo,System.Linq.Expressions.Expression[])
<IL 0x0010a, 0x0023f>
at Moq.Mock.Verify<Foo.B>
(Moq.Mock,System.Linq.Expressions.Expression`1<System.Action`1<Foo.B>>,Moq.Times,string)
<0x001af>
at Moq.Mock`1<Foo.B>.Verify
(System.Linq.Expressions.Expression`1<System.Action`1<Foo.B>>) <0x0005c>
at Foo.ATest.TestDoFindC () [0x0003d] in
/Users/work/Projects/orbiter-mobile/test-orbiter-core/Controllers/ATest.cs:49
at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke
(object,object[],System.Exception&) <0x00004>
at System.Reflection.MonoMethod.Invoke
(object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo)
<IL 0x000d6, 0x0012a>


Expected Results:  
Test passes.

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list