internal unsafe void ConvertToManaged(object pManagedHome, IntPtr pNativeHome)
        {
            switch (this.backPropAction)
            {
            case AsAnyMarshaler.BackPropAction.Array:
                MngdNativeArrayMarshaler.ConvertContentsToManaged(this.pvArrayMarshaler, ref pManagedHome, new IntPtr((void *)(&pNativeHome)));
                return;

            case AsAnyMarshaler.BackPropAction.Layout:
                StubHelpers.FmtClassUpdateCLRInternal(pManagedHome, (byte *)pNativeHome.ToPointer());
                return;

            case AsAnyMarshaler.BackPropAction.StringBuilderAnsi:
            {
                sbyte *newBuffer = (sbyte *)pNativeHome.ToPointer();
                ((StringBuilder)pManagedHome).ReplaceBufferAnsiInternal(newBuffer, Win32Native.lstrlenA(pNativeHome));
                return;
            }

            case AsAnyMarshaler.BackPropAction.StringBuilderUnicode:
            {
                char *newBuffer2 = (char *)pNativeHome.ToPointer();
                ((StringBuilder)pManagedHome).ReplaceBufferInternal(newBuffer2, Win32Native.lstrlenW(pNativeHome));
                return;
            }

            default:
                return;
            }
        }
Exemplo n.º 2
0
        internal unsafe void ConvertToManaged(object pManagedHome, IntPtr pNativeHome)
        {
            switch (backPropAction)
            {
            case BackPropAction.Array:
            {
                MngdNativeArrayMarshaler.ConvertContentsToManaged(
                    pvArrayMarshaler,
                    ref pManagedHome,
                    new IntPtr(&pNativeHome));
                break;
            }

            case BackPropAction.Layout:
            {
                StubHelpers.FmtClassUpdateCLRInternal(pManagedHome, (byte *)pNativeHome);
                break;
            }

            case BackPropAction.StringBuilderAnsi:
            {
                int length;
                if (pNativeHome == IntPtr.Zero)
                {
                    length = 0;
                }
                else
                {
                    length = string.strlen((byte *)pNativeHome);
                }

                ((StringBuilder)pManagedHome).ReplaceBufferAnsiInternal((sbyte *)pNativeHome, length);
                break;
            }

            case BackPropAction.StringBuilderUnicode:
            {
                int length;
                if (pNativeHome == IntPtr.Zero)
                {
                    length = 0;
                }
                else
                {
                    length = string.wcslen((char *)pNativeHome);
                }

                ((StringBuilder)pManagedHome).ReplaceBufferInternal((char *)pNativeHome, length);
                break;
            }

                // nothing to do for BackPropAction.None
            }
        }