[Mono-list] using 'unsafe struct *' instead of IntPtr with PInvoke..
jeske
davidj at gmail.com
Wed Dec 22 18:35:06 EST 2010
This is a fairly subtle question about PInvoke and GC interaction. It's
related to .NET in general, not just mono, but I figure folks implementing a
.NET runtime may actually know the answer.
Platform Invoke documentation advocates using System.IntPtr as an opaque
type. However, this is a single opaque type, which eliminates typechecking
that could be done to distinguish different opaque types.
In writing PInvoke modules with many native pointer types, I want the
compiler to type-check different native pointer types, so I've begun to use
a different pattern with unsafe structs pointers. I'm writing to find out if
anyone believes this is invalid for any reason. Instead of storing an IntPtr
for later use, I declare an opaque struct type and use it to hold a pointer.
For example:
class Foo {
unsafe struct FOO {}; // opaque type
unsafe FOO* my_foo; // instead of IntPtr
[DllImport("mylibary")]
extern static unsafe FOO* get_foo();
[DllImport("mylibrary")]
extern static unsafe do_something_foo(FOO *foo);
public unsafe Foo() {
this.my_foo = get_foo();
}
public unsafe doSomethingFoo() {
do_something_foo(this.my_foo);
}
}
Is there anything wrong with this pattern? For example, is this "unsafe FOO
*my_foo" something that I can assume the GC system will completely leave
alone, or will the GC try to trace it in some way?
At a deeper level, I wonder why Platform Invoke doesn't advocate using
something like this more often, because it's alot safer than storing and
passing everything around as IntPtr.
Thoughts?
--
View this message in context: http://mono.1490590.n4.nabble.com/using-unsafe-struct-instead-of-IntPtr-with-PInvoke-tp3161427p3161427.html
Sent from the Mono - General mailing list archive at Nabble.com.
More information about the Mono-list
mailing list