This has been fixed on mono master, on what will become 2.12.<br><br><div class="gmail_quote">On Thu, Aug 16, 2012 at 1:35 PM, jeske <span dir="ltr"><<a href="mailto:davidj@gmail.com" target="_blank">davidj@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have a C# wrapper for a native DLL which exists on both windows and UNIX.<br>
However, it doesn't work on Mono because of a behavior difference between<br>
Mono and <a href="http://MS.NET" target="_blank">MS.NET</a>.<br>
<br>
Specifically, I use "unsafe struct pointers" to manage pointers to opaque<br>
data (rather than IntPtr). I do this to get typechecking, because there are<br>
a bunch of types of pointers, and using IntPtr is dangerously<br>
non-type-checked.  (I honestly don't undertand why IntPtr is allowed, rather<br>
than always requiring the use of typed unsafe-struct-pointers.)<br>
<br>
<a href="http://stackoverflow.com/questions/4503795/is-it-valid-to-use-unsafe-struct-as-an-opaque-type-instead-of-intptr-in-net-p" target="_blank">http://stackoverflow.com/questions/4503795/is-it-valid-to-use-unsafe-struct-as-an-opaque-type-instead-of-intptr-in-net-p</a><br>

<br>
My code looks something like:<br>
<br>
// opaque types<br>
public unsafe struct HDF {};<br>
<br>
// NEOERR* hdf_set_value (HDF *hdf, char *name, char *value)<br>
[DllImport("libneo")]<br>
private static unsafe extern NEOERR* hdf_set_value(HDF *hdf,<br>
     [MarshalAs(UnmanagedType.LPStr)]<br>
      string name,<br>
     [MarshalAs(UnmanagedType.LPStr)]<br>
      string value);<br>
<br>
This works fine in <a href="http://MS.NET" target="_blank">MS.NET</a>, but Mono complains with the following error:<br>
<br>
Unhandled Exception:<br>
System.Runtime.InteropServices.MarshalDirectiveException: Can not marshal<br>
'parameter #1': Pointers can not reference marshaled structures. Use byref<br>
instead.<br>
  at (wrapper managed-to-native) Clearsilver.Hdf:hdf_set_value<br>
(Clearsilver.HDF*,string,string)<br>
  at Clearsilver.Hdf.setValue (System.String name, System.String value)<br>
[0x00000]<br>
  at CSTest.Main (System.String[] argv) [0x00000]<br>
<br>
My questions:<br>
<br>
(1) Why is Mono complaining about this? In the CLR, an unsafe struct pointer<br>
is not a marshalled structure, it's a value type.<br>
<br>
(2) Why would it suggest using ByRef? ByRef is for managed pointers to<br>
managed data. This is a value-type pointer value.  AFAIK, ByRef is not<br>
capable of doing anything here, because the pointer is just a "typed" IntPtr<br>
value type.<br>
<br>
<br>
<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://mono.1490590.n4.nabble.com/using-unsafe-structs-as-opaque-pointers-tp4656281.html" target="_blank">http://mono.1490590.n4.nabble.com/using-unsafe-structs-as-opaque-pointers-tp4656281.html</a><br>

Sent from the Mono - Dev mailing list archive at Nabble.com.<br>
_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br>