[Mono-bugs] [Bug 590042] New: Dynamically generated methods/delegates using custom marshalling with p/invoke crash the application

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sun Mar 21 16:59:05 EDT 2010



           Summary: Dynamically generated methods/delegates using custom
                    marshalling with p/invoke crash the application
    Classification: Mono
           Product: Mono: Runtime
           Version: 2.6.x
          Platform: x86-64
        OS/Version: Mac OS X 10.5
            Status: NEW
          Severity: Major
          Priority: P5 - None
         Component: interop
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: goldencrystal at gmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---

Description of Problem:
When a delegate type is created dynamically, and the delegate's signature
(actually, its Invoke method's signature) uses an ICustomMarshaler, the mono
runtimes crashes on a failed assertion.
There seems to be some related problem with dynamically generated p/invoke
methods too, but only under specific conditions. (Actually, the condition seems
to be giving the (marshaled) parameter any value other than null)

Steps to reproduce the problem:
1. Create a new type inheriting System.MulticastDelegate insinde of a
2. Add the standard constructor for delegate types
3. Implement the Invoke method, and apply a MarshalAsAttribute with
CustomMarshaler to (at least) one of the parameters.
4. Create the actual type and instantiate a delegate
5. Use the instantiated delegate for p/invoke

6. Or: Create a dynamic P/Invoke method with at least one custom marshaler as
parameter, and invoke it with something else than null as value.

Actual Results:
ERROR:marshal.c:5271:emit_marshal_custom: assertion failed: (mtype != NULL)

  at (wrapper managed-to-native) object.__icall_wrapper_mono_delegate_to_ftnptr
(object) <0x00004>
  at (wrapper managed-to-native) object.__icall_wrapper_mono_delegate_to_ftnptr
(object) <0x00004>
  at (wrapper managed-to-native) EmitMarshalTestCase.Program.dummyMethod
(System.Delegate) <IL 0x00003, 0x00026>
  at EmitMarshalTestCase.Program.Main (string[]) [0x0025a] in
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object
(object,intptr,intptr,intptr) <IL 0x0001d, 0x00043>
L'application s'est terminée suite au signal: SIGIOT

Expected Results:
No error. (Verified on MS.NET's runtime)

How often does this happen? 

Additional Information:
1. It seems that when a delegate with the same signature (and mashaling) is
generated by the C# compiler (csc or gmcs) and then instantiated (the
instantiation is the important part) and used with the same p/invoke method,
the dynamically created delegate won't crash thereafter. However, this
completely defeats the purpose of a dynamically created delegate.
2. From the code where the assertions fails, it seems that there is a problem
in resolving the custom marshaler's type from the extracted method's metadata,
but the exact origin of the problem is difficult to locate without a very good
understanding of the mono runtime internals.

Configure bugmail: http://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