|
I'm using a couple of API calls that require function pointers for callbacks.
So far I've been passing in a delegate instance and it's worked fine. I'm concerned that the delegate reference however may be changed in managed memory. On researching this I came accross the Marshal.GetFunctionPointerForDelegate method.
Some people say this is not needed as passing the delegate directly invokes the internal version of this anyway. Other's suggest that pinning the delegate or the class instance that contains it is necessary.
All MSDN has to offer is "You must manually keep the delegate from being collected by the garbage collector from managed code."
Has anyone had total success (or occaisional failures) just passing the delegate instance directly, or recommend a robust approach?
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Hi Dave,
I strongly suspect .NET pins function parameters for you when there is a need to do so, of course only for as long as the native function is being called. This applies to:
- strings you pass to a const char*
- StringBuilders you pass to a char*
- delegates you pass to a function pointer
- etc.etc.
I have been doing this all along. I only use GCHandle to explicitly pin down things that need to remain natively in use after the native function returns, such as buffers that will be used asynchronously.
I've never used Marshal.GetFunctionPointerForDelegate(); I suspect the only real use for it is when a delegate is buried inside a larger structure. Same seems to apply for a lot of stuff in the Marshal class.
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
Hi Luc,
Thanks, pretty much confirms what I thought. I've found a little more MSDN documentation to support this too so I can rest more easily
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Just a quick follow up Luc...
The delegate is a parameter in an Open function. To keep the instance alive, I have a private static list of open devices and the instance is added to that.
The callbacks can keep coming until the Close function is called. When closing, I'm removing the instance from the static list. I've also implemented the Dispose pattern on the device instances and if any are open when Dispose is called, the Close function is called. Doing it this way seems to remove the need for any pinning etc.
Is that sufficient in your opinion?
(I haven't managed to call the Close without runtime errors from a finalizer BTW, so if you know a solution to that I'd be glad to hear it! I can post code if you wish).
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Hi Dave,
DaveyM69 wrote: To keep the instance alive, I have a private static list of open devices and ...
That should be fine, although I would probably prefer to have the delegate as an instance member of your device object, rather than in a static list. I probably would also have a static list of devices, either just for debugging or to make sure they remain alive if that's useful. Or I would try and create such device objects with a using construct provided that fits the overall software architecture.
DaveyM69 wrote: I haven't managed to call the Close without runtime errors from a finalizer
That doesn't ring any bells (maybe the symptoms are too vague to ring anything). I trust you are aware all finalizers are ran from a single low-priority thread in the GC (not necessarily soon), and having a finalizer throwing uncatched exceptions is (or at least has been) a bad idea. That reminds me it has been a long time I researched finalizers...
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
Luc Pattyn wrote: prefer to have the delegate as an instance member... have a static list of devices
That's what I meant, I just didn't describe it that well! This code is to be consumed elsewhere so the using would be tricky to implement here - but easy for the consumer.
The Close from the finalizer is a strange issue. It works fine (I think) if the finalizer is called during normal execution, but if called when a consuming application closes (and so releases all references) it causes the problems. I don't have the code with me right now but will post a snippet later when I get home (this is a hobby not work project - the best kind ).
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
I just made a complete sample ready to post here, and calling Close in the finalizer is working without error!
Must have something else causing the problem in the original code - thanks for your time anyway!
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
perseverance is king!
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
im right now working on codedom. im supposed to create a appdomain n let the resulting code (the output code) of my program run in the appdomain, how do i do it??? also how do i unload the appdomain once my work is done!!! please help me out.... am lost!!!
|
|
|
|
|
yams2510 wrote: im supposed to create a appdomain n let the resulting code (the output code) of my program run in the appdomain, how do i do it???
As shown in example here [^]at MSDN.
Manas Bhardwaj
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Not that trivial this. You can create an AppDomain easily enough (CreateDomain method on static AppDomain if I remember rightly). Not sure how you inject your codedom stuff in there, but I'm sure there's examples on the net.
You then need to marshal your calls to the stuff in the new app domain. You'll probably need to create a stub class in the new AppDomain and derive from MarshalByRefObject to do this.
You can dispose of an AppDomain by calling Unload.
Make any sense?
Regards,
Rob Philpott.
|
|
|
|
|
hey thanks..... it did make some sense.... the problem is am new to asp.net c# programming..... so new dat i just heard datsome thing called CODEDOm existed 4 days ago...some how dealt with it n now am sorta programmin in it... n yestday i was asked to work on appdomain... n im kinda lost... so it would be very very helpful if u could elaborate ..... thnx a lot ...inadvance...
|
|
|
|
|
Is there a WMI namespace, class and properties to get the time on a machine?
Thanks
|
|
|
|
|
Look at this[^].
Did you try even once to find the answer yourself?
Manas Bhardwaj
Please remember to rate helpful or unhelpful answers, it lets us and people reading the forums know if our answers are any good.
|
|
|
|
|
Hi,
Try Win32_LocalTime, or Win32_UTCTime and Win32_TimeZone.
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
|
System.TimeZone for the current time zone.
DateTime.Now for the current time.
Anything else?
Panic, Chaos, Destruction.
My work here is done.
|
|
|
|
|
Nagy Vilmos wrote: Anything else?
for remote queries WMI may work better.
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
woteva
Panic, Chaos, Destruction.
My work here is done.
|
|
|
|
|
akármi?
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
igen.
Panic, Chaos, Destruction.
My work here is done.
|
|
|
|
|
rendben!
Luc Pattyn [Forum Guidelines] [My Articles]
DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.
|
|
|
|
|
hello,
I use Microsoft.Office.Interop.Excel to creat excell file-I create it and in the end of the work with it i close it using
Microsoft.Office.Interop.Excel.Application ExcelApp
But the problem is that even after i close the application the excell still appears in the task manager(in processes).
How can i kill it in the program (when i finish working with excell)?
|
|
|
|
|
I did it this way :
ApplicationClass app = new ApplicationClass();
Workbook workBook = app.Workbooks.Open(filename, 0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
...
app.Workbooks.Close();
app.Quit();
Marshal.FinalReleaseComObject(app);
|
|
|
|
|
It doesn't help.
I still have the process of EXCELL running (in task manager)
|
|
|
|