Is it possible to invoke a C# delegate/event handler asynchronously,
from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call
BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !! 11 11134
Yoni,
It is not possible from unmanaged C. You will either have to use the
#pragma managed and #pragma unmanaged directives to enter into managed code
and make the call, or you will have to marshal the delegate as a function
pointer, in which case you would have to call it asynchronously, creating
your own thread, etc, etc. Or, you could export the type as a COM object
and use that, calling the BeginInvoke method yourself.
Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message
news:d9**************************@posting.google.c om... Is it possible to invoke a C# delegate/event handler asynchronously, from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !!
Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way,
it gets moved around.
The Unmanaged code not being aware of this change, invokes the Managed code.
However it is using the wrong address. And this leads to a crash -
"ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote
in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use the #pragma managed and #pragma unmanaged directives to enter into managed
code and make the call, or you will have to marshal the delegate as a function pointer, in which case you would have to call it asynchronously, creating your own thread, etc, etc. Or, you could export the type as a COM object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... Is it possible to invoke a C# delegate/event handler asynchronously, from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !!
Assaf,
How are you doing it? Which method are you using?
--
- Nicholas Paldino [.NET/C# MVP]
- ni**************@exisconsulting.com
<as*****@hotmail.com> wrote in message
news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed
code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com>
wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use
the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a
function pointer, in which case you would have to call it asynchronously,
creating your own thread, etc, etc. Or, you could export the type as a COM
object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... Is it possible to invoke a C# delegate/event handler asynchronously, from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !!
check this out.
it has some code.
in the visual studio .net:
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/cpguide/html/cpconcallbacksam
ple.htm
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote
in message news:uK**************@TK2MSFTNGP11.phx.gbl... Assaf,
How are you doing it? Which method are you using?
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
<as*****@hotmail.com> wrote in message news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a function pointer, in which case you would have to call it asynchronously, creating your own thread, etc, etc. Or, you could export the type as a COM object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... > Is it possible to invoke a C# delegate/event handler asynchronously, > from unmanaged C++ ? > > I assume this requires a Managed C++ wrapper, which would call > BeginInvoke on the delegate ? > > Is this correct, and if so, does anyone have an example ? > > Thanks !!
I do not know if I'm off topic. However, I had a crash problem (after a
about 1000 calls) when using a callback from C to C# (having delegate in
C#).
The problem was in the C declaration. Here is a correct sample (watch for
the 2nd WINAPI)
// in C header file:
DLLEXPORT void WINAPI PassExitFnPtr (void (WINAPI * pExit)(int exit_code));
José
<as*****@hotmail.com> a écrit dans le message de
news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed
code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com>
wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use
the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a
function pointer, in which case you would have to call it asynchronously,
creating your own thread, etc, etc. Or, you could export the type as a COM
object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... Is it possible to invoke a C# delegate/event handler asynchronously, from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !!
BTW, I had a second problem as well.
You have to make sure that you keep a live reference to your delegate in
your C# code (this has to be kept as long as the callback could be fired)
José
"José Joye" <jose.joye@__No_SPam__bluewin__maPS_oN__.ch> a écrit dans le
message de news:e5*************@TK2MSFTNGP09.phx.gbl... I do not know if I'm off topic. However, I had a crash problem (after a about 1000 calls) when using a callback from C to C# (having delegate in C#). The problem was in the C declaration. Here is a correct sample (watch for the 2nd WINAPI)
// in C header file: DLLEXPORT void WINAPI PassExitFnPtr (void (WINAPI * pExit)(int
exit_code));
José
<as*****@hotmail.com> a écrit dans le message de news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a function pointer, in which case you would have to call it asynchronously, creating your own thread, etc, etc. Or, you could export the type as a COM object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... > Is it possible to invoke a C# delegate/event handler asynchronously, > from unmanaged C++ ? > > I assume this requires a Managed C++ wrapper, which would call > BeginInvoke on the delegate ? > > Is this correct, and if so, does anyone have an example ? > > Thanks !!
actually your problem sounds very similar to mine.
i am actually running a test now.
with your modification!
if this works, it will end 3 months of chasing this bug.
tnx
assaf
"José Joye" <jose.joye@__No_SPam__bluewin__maPS_oN__.ch> wrote in message
news:e5*************@TK2MSFTNGP09.phx.gbl... I do not know if I'm off topic. However, I had a crash problem (after a about 1000 calls) when using a callback from C to C# (having delegate in C#). The problem was in the C declaration. Here is a correct sample (watch for the 2nd WINAPI)
// in C header file: DLLEXPORT void WINAPI PassExitFnPtr (void (WINAPI * pExit)(int
exit_code));
José
<as*****@hotmail.com> a écrit dans le message de news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com> wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a function pointer, in which case you would have to call it asynchronously, creating your own thread, etc, etc. Or, you could export the type as a COM object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... > Is it possible to invoke a C# delegate/event handler asynchronously, > from unmanaged C++ ? > > I assume this requires a Managed C++ wrapper, which would call > BeginInvoke on the delegate ? > > Is this correct, and if so, does anyone have an example ? > > Thanks !!
Hello,
Whenever doing p/invoke or interop under .NET 1.1+,
I suggest to use CLR SPY: http://blogs.gotdotnet.com/anathan/P...b-8448824b8267
This uses CDP - Customer Debug Probes. More information about these probes
can be found at:
X:\...\SDK\v1.1\Tool Developers Guide\Samples\cdp\Managed\ReadMe.txt
X:\...\SDK\v1.1\Tool Developers Guide\Samples\cdp\
These probes will help you find marshalling related bugs much faster. For
example,
let's say there is a calling convention mismatch. Here is what you can get
with CLR SPY
logging:
"...PInvoke Calling Convention Mismatch in ConsoleApplication.exe...: Stack
imbalance
may be caused by incorrect calling convention for method
TestFunc(win32dll.dll)"
I hope it helps
<as*****@hotmail.com> wrote in message
news:ub**************@TK2MSFTNGP11.phx.gbl... Nicholas, maybe i don't understand you,
but, I'm doing it!
However, my app crashes after about 15 minutes of doing it intesively.
I fear that since i am not locking down the manged code in any way, it gets moved around. The Unmanaged code not being aware of this change, invokes the Managed
code. However it is using the wrong address. And this leads to a crash - "ExecutionEngineException".
assaf
"Nicholas Paldino [.NET/C# MVP]" <ni**************@exisconsulting.com>
wrote in message news:eS*************@tk2msftngp13.phx.gbl... Yoni,
It is not possible from unmanaged C. You will either have to use
the #pragma managed and #pragma unmanaged directives to enter into managed code and make the call, or you will have to marshal the delegate as a
function pointer, in which case you would have to call it asynchronously,
creating your own thread, etc, etc. Or, you could export the type as a COM
object and use that, calling the BeginInvoke method yourself.
Hope this helps.
-- - Nicholas Paldino [.NET/C# MVP] - ni**************@exisconsulting.com
"Yoni Rabinovitch" <yo**************@adc.com> wrote in message news:d9**************************@posting.google.c om... Is it possible to invoke a C# delegate/event handler asynchronously, from unmanaged C++ ?
I assume this requires a Managed C++ wrapper, which would call BeginInvoke on the delegate ?
Is this correct, and if so, does anyone have an example ?
Thanks !!
Thanks, everyone, for your input.
I should have mentioned that a central requirement of mine was to be
able to do this without any DllImport stuff, just straight IJW.
In the end, I found an (albeit convoluted) way of doing this, at http://www.codeproject.com/managedcpp/cbwijw.asp.
This shows how to synchronously invoke a C# delegate via a callback
from unmanaged C++, without any DllImports.
It is reasonably straightforward to extend this example to cover
asynchronous invocation (BeginInvoke...EndInvoke).
I'm not too clear with what you said. To me, IJW is not available to C#.
Only to managed C++.
Am I wrong?
José
"Yoni Rabinovitch" <yo**************@adc.com> a écrit dans le message de
news:d9**************************@posting.google.c om... Thanks, everyone, for your input.
I should have mentioned that a central requirement of mine was to be able to do this without any DllImport stuff, just straight IJW.
In the end, I found an (albeit convoluted) way of doing this, at http://www.codeproject.com/managedcpp/cbwijw.asp.
This shows how to synchronously invoke a C# delegate via a callback from unmanaged C++, without any DllImports.
It is reasonably straightforward to extend this example to cover asynchronous invocation (BeginInvoke...EndInvoke).
"José Joye" <jose.joye@__No_SPam__bluewin__maPS_oN__.ch> wrote in message news:<eY**************@TK2MSFTNGP12.phx.gbl>... I'm not too clear with what you said. To me, IJW is not available to C#. Only to managed C++. Am I wrong?
No, you're right. However, what I meant is that I have unmanaged C++,
which I wrap with managed C++. The C# is only "aware" of the managed
C++.
Now, essentially what I'm doing is to get the unmanaged C++ to
callback the C# delegate asynchronously, without using any DllImports
in the plumbing for all this. This discussion thread is closed Replies have been disabled for this discussion. Similar topics
11 posts
views
Thread by Yoni Rabinovitch |
last post: by
|
13 posts
views
Thread by Christian Westerlund |
last post: by
|
2 posts
views
Thread by rawCoder |
last post: by
|
11 posts
views
Thread by Florian A. |
last post: by
|
9 posts
views
Thread by Terry Olsen |
last post: by
|
reply
views
Thread by Haxan |
last post: by
|
reply
views
Thread by rubino57 |
last post: by
|
3 posts
views
Thread by CAIBird |
last post: by
|
4 posts
views
Thread by igd |
last post: by
| | | | | | | | | | |