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; } }
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 } }