[Mono-dev] When passing managed array of COM object references (Marshaled as UnmanagedType.LPArray) to native Code, expected native COM ptrs are invalid.

Jonathan Chambers joncham at gmail.com
Mon Aug 25 22:58:20 EDT 2008


Hello,
      Please file a bug and I will take a look at this.

Thanks,
Jonathan

On Sat, Aug 16, 2008 at 6:46 AM, Ivan N. Zlatev <contact at i-nz.net> wrote:

> On Fri, Aug 15, 2008 at 2:43 AM, Tom Hindle <tom_hindle at sil.org> wrote:
> >
> > Hi,
> >
> > When passing managed array of COM object references (Marshaled as
> > UnmanagedType.LPArray) to native Code, expected native COM ptrs are
> > invalid. This same technique works when running on MS .Net.
>
> If it works on MS.NET and not on Mono then it's a bug and as such it
> should be filed with a small self-contained test case. For information
> on how to file bugs check: http://mono-project.com/Bugs .
>
> >
> > 1. I'm running on Linux (Hardy), using mono build from svn.
> >
> > 2. I have created 2 C++ COM objects using libCom.
> >
> > 3. I have created a c# Interop to call/create these COM objects.
> >
> > relevant line in Interop is:
> >
> >
> [MethodImpl(MethodImplOptions.InternalCall,MethodCodeType=MethodCodeType.Runtime)]
> > public virtual extern void PassComArray(
> > int length,
> > [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0]
> > INativeCreatedObject[] a);
> >
> > 4. I create an instance of the COM object in c#
> >   I use that to return a Naively created COM object to c#.
> >   I can use this COM object in c#.
> >   However passing this COM object ref as an array back to native
> > doesn't work.
> >
> > IE:
> >
> > Test t = new Test(); // Create Com object Test
> > INativeCreatedObject i;
> > t.CreateNativeObject(out i); // return another Com object created
> > naively. // prints address as 0x83cbd50
> >
> > i.DoSomething(); // Works fine.
> >
> > // Create managed array
> > INativeCreatedObject[] array = new INativeCreatedObject[10];
> > array[0] = i;
> >
> > t.PassComArray(1, array); // address of array element 0 is 0x60d80 not
> > 0x83cbd50 which means using the COM object ptr will crash.
> >
> > 5. This Marshaling technique works in mono when passing int's.
> >
> > IE:
> >                                MethodImpl(MethodImplOptions.InternalCall,
> > MethodCodeType=MethodCodeType.Runtime)]
> > public virtual extern void
> > PassIntArray([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)]
> >  int length, int[] a);
> >
> > 6. after gdb-ing mono I suspect the problem with the CIL that is
> > generated for the marshaling (is it called the Runtime Callable
> > Wrapper?) However I can't verify this as I can't program in any
> > Assembler :(
> >
> > I have a work around using a custom marshaler, but I would rather use
> > the same interops on both Windows and Linux.
> >
> > Thanks in advance for any advice.
> > Tom
> >
> >
> >
> >
> > _______________________________________________
> > Mono-devel-list mailing list
> > Mono-devel-list at lists.ximian.com
> > http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
>
> --
> Kind Regards,
> Ivan N. Zlatev
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20080825/3f33ea35/attachment-0001.html 


More information about the Mono-devel-list mailing list