<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi, <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I am sure someone can help me out. At one point this code did work. I changed something and/or I just reinstalled latest trunk and it broke…<o:p></o:p></p><p class=MsoNormal>I am trying to pass C delegate to C#. Everything is working C# is calling back the method but the parameters seems to be invalid pointers.<o:p></o:p></p><p class=MsoNormal>The C delegate was returning the delegate object, and the parameters.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I did put mono_ftnptr_to_delegate to external removing MONO_INTERNAL and placing it under MONO_API.<o:p></o:p></p><p class=MsoNormal>One could use Marshal.GetDelegateFromPointer with mono_runtime_invoke (Adding that way too at the bottom…)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Consider the following code:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>DelegateHelper.dll: MyClass.cs:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>using System;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>namespace DelegateHelper<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal>        public delegate bool TestDelegate(string arg1);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>        public class MyClass<o:p></o:p></p><p class=MsoNormal>        {<o:p></o:p></p><p class=MsoNormal>                public static bool Test(TestDelegate predicate)<o:p></o:p></p><p class=MsoNormal>                {<o:p></o:p></p><p class=MsoNormal>                        return predicate("TEST");<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>        }<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>main.c:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>#include <stdio.h><o:p></o:p></p><p class=MsoNormal>#include <glib.h><o:p></o:p></p><p class=MsoNormal>#include <mono/jit/jit.h><o:p></o:p></p><p class=MsoNormal>#include <mono/metadata/object.h><o:p></o:p></p><p class=MsoNormal>#include <mono/metadata/reflection.h><o:p></o:p></p><p class=MsoNormal>#include <mono/metadata/assembly.h><o:p></o:p></p><p class=MsoNormal>#include <mono/metadata/threads.h><o:p></o:p></p><p class=MsoNormal>#include <mono/metadata/mono-config.h><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>MONO_API MonoDelegate*<o:p></o:p></p><p class=MsoNormal>mono_ftnptr_to_delegate (MonoClass *klass, gpointer ftn);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>MonoBoolean testMethod(MonoObject *arg1, MonoObject *arg2)<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal>        printf("Calling delegate!");<o:p></o:p></p><p class=MsoNormal>        MonoString *str = mono_object_to_string(arg2, NULL); //crash<o:p></o:p></p><p class=MsoNormal>        return TRUE;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>int main (int argc, char *argv[])<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal>        printf ("Delegate Test!\n");<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>        MonoDomain *domain = mono_jit_init_version("DelegateTest", "v4.0.30319");<o:p></o:p></p><p class=MsoNormal>        mono_config_parse(NULL);<o:p></o:p></p><p class=MsoNormal>        void *__parameters__[1];<o:p></o:p></p><p class=MsoNormal>        MonoAssembly *ass = mono_assembly_open("DelegateHelper.dll", NULL);<o:p></o:p></p><p class=MsoNormal>        MonoImage *image = mono_assembly_get_image(ass);<o:p></o:p></p><p class=MsoNormal>        MonoClass *delegateClass = mono_class_from_name(image, "DelegateHelper", "TestDelegate");<o:p></o:p></p><p class=MsoNormal>        mono_class_init(delegateClass);<o:p></o:p></p><p class=MsoNormal>        MonoClass *testClass = mono_class_from_name(image, "DelegateHelper", "MyClass");<o:p></o:p></p><p class=MsoNormal>        mono_class_init(testClass);<o:p></o:p></p><p class=MsoNormal>        gpointer ptr = (gpointer)testMethod;<o:p></o:p></p><p class=MsoNormal>        MonoDelegate *delegateObj = mono_ftnptr_to_delegate(delegateClass, ptr); //Short way to call Marshal.GetDelegateFromFunctionPointer()<o:p></o:p></p><p class=MsoNormal>        MonoMethod *testMethod = mono_class_get_method_from_name(testClass, "Test", 1);<o:p></o:p></p><p class=MsoNormal>        __parameters__[0] = delegateObj;<o:p></o:p></p><p class=MsoNormal>        MonoObject *result = mono_runtime_invoke(testMethod, NULL, __parameters__, NULL);<o:p></o:p></p><p class=MsoNormal>        return 0;<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Result:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Delegate Test!<o:p></o:p></p><p class=MsoNormal>Calling delegate!<o:p></o:p></p><p class=MsoNormal>Stacktrace:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>  at <unknown> <0xffffffff><o:p></o:p></p><p class=MsoNormal>  at (wrapper managed-to-native) object.wrapper_native_0x40ea40 () <0xffffffff><o:p></o:p></p><p class=MsoNormal>  at DelegateHelper.MyClass.Test (System.Func`2<string, bool>) <0x00018><o:p></o:p></p><p class=MsoNormal>  at (wrapper runtime-invoke) <Module>.runtime_invoke_bool_object (object,intptr,intptr,intptr) <0xffffffff><o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>=================================================================<o:p></o:p></p><p class=MsoNormal>Got a SIGSEGV while executing native code. This usually indicates<o:p></o:p></p><p class=MsoNormal>a fatal error in the mono runtime or one of the native libraries<o:p></o:p></p><p class=MsoNormal>used by your application.<o:p></o:p></p><p class=MsoNormal>=================================================================<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Abort<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This code could be used instead of mono_ftnptr_to_delegate which is normally internal<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>        /*<o:p></o:p></p><p class=MsoNormal>        MonoImage *mscorlib = mono_assembly_get_image(mono_domain_assembly_open(domain, "mscorlib"));<o:p></o:p></p><p class=MsoNormal>        MonoClass *marshal = mono_class_from_name(mscorlib, "System.Runtime.InteropServices", "Marshal");<o:p></o:p></p><p class=MsoNormal>        MonoMethod *getDelegate = mono_class_get_method_from_name(marshal, "GetDelegateForFunctionPointer", 2);<o:p></o:p></p><p class=MsoNormal>        void *marshal_params[2];<o:p></o:p></p><p class=MsoNormal>        marshal_params[0] = ptr;<o:p></o:p></p><p class=MsoNormal>        marshal_params[1] = mono_type_get_object(domain, mono_class_get_type(delegateClass));<o:p></o:p></p><p class=MsoNormal>        MonoObject *delegateObj = mono_runtime_invoke(getDelegate, NULL, marshal_params, NULL);<o:p></o:p></p><p class=MsoNormal>        */<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Please help!!<o:p></o:p></p></div></body></html>