[Mono-dev] sigc++ signal C# wraper

buhochileno at gmail.com buhochileno at gmail.com
Tue Oct 30 17:39:54 EDT 2007


Amaizing explanation!!!, is very clear for me now :-) , I't would never 
have found the solution...Yes Master, it fix the problem.

thank you again Jon.

Mauricio.

Jonathan Pryor wrote:
> On Tue, 2007-10-30 at 17:33 -0300, buhochileno at gmail.com wrote:
>   
>> I only have now a little problem, but I'm sure that is my stupidity, I 
>> add to the C# example code that you send me a delegate and a event , to 
>> allow to other C# class to asociate  method to this event in a 
>> traditional .Net/mono way, something like this (only for test):
>> ...
>> [DllImport ("/usr/local/lib/devel/libaliendetector.so")]
>>     private static extern void AlienDetector_AddSignalDetected (IntPtr 
>> detector, SignalDetectedHandler h);
>> ...
>> public delegate void SignalDetectedHandlerM (); //I define this to not 
>> use the delegate used in the 
>>     
>
> There's no need to use a new delegate type here.  It only increases
> overhead (more types to JIT) for no obvious gain.
>
>   
>> //DllImport...AlienDetector_AddSignalDetected...
>>     public static event SignalDetectedHandlerM SignalDetected;
>> ...
>> and then in the "MyHandler" method (the method executed by the unmanaged 
>> code) I add this:
>>     public static void MyHandler ()
>>     {
>>         Console.WriteLine ("Managed Code Invoked!"); //this work prefectly
>>         Demo.SignalDetected(); //traditional .net/mono event trigger, 
>> dont' work
>>     }
>> ...allways I get a:
>> Unhandled Exception: System.NullReferenceException: Object reference not 
>> set to an instance of an object
>>     
>
> The problem is a C# language "feature" that trips up many people: if
> there are no subscribers to an event, then the event is "null".
> Consequently, you need to guard against a null event:
>
> 	SignalDetectedHandler h = Demo.SignalDetected;
> 	if (h != null)
> 		h ();
>
> Yes, you should have a temporary `h' variable, as done above, for thread
> safety reasons.  (Assignment is atomic.  If you instead did
> "if(Demo.SignalDetected != null) Demo.SignalDetected ();", then
> Demo.SignalDetected could be changed by another thread in between the
> `if' and the Demo.SignalDetected() invocation.  Using `h' is safe,
> because assignment is atomic, and if Demo.SignalDetected is changed
> between `if (h != null)' and `h ();', it won't matter, as `h' itself
> will be unchanged.)
>
>  - Jon
>
>
>
>   




More information about the Mono-devel-list mailing list