X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Runtime.InteropServices%2FMarshal.cs;h=f983beeb634111f050844731b252ead7ccf04db1;hb=c5cdfaec1e0973ced3f97ef589cd0bece56067ad;hp=1b650da569d25bda48ab02c01ab63dadb89c4d9e;hpb=0b4bc83e79ca3057693089dc7f926004bb9d9592;p=mono.git diff --git a/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs b/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs index 1b650da569d..f983beeb634 100644 --- a/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs +++ b/mcs/class/corlib/System.Runtime.InteropServices/Marshal.cs @@ -412,7 +412,7 @@ namespace System.Runtime.InteropServices var errorInfo = new ManagedErrorInfo(e); SetErrorInfo (0, errorInfo); - return e.hresult; + return e._HResult; #else return -1; #endif @@ -578,7 +578,7 @@ namespace System.Runtime.InteropServices throw new NotImplementedException (); } -#if !MOBILE +#if !FULL_AOT_RUNTIME [Obsolete] [MonoTODO] public static string GetTypeInfoName (UCOMITypeInfo pTI) @@ -979,6 +979,21 @@ namespace System.Runtime.InteropServices return SizeOf (structure.GetType ()); } + internal static uint SizeOfType (Type type) + { + return (uint) SizeOf (type); + } + + internal static uint AlignedSizeOf () where T : struct + { + uint size = SizeOfType (typeof (T)); + if (size == 1 || size == 2) + return size; + if (IntPtr.Size == 8 && size == 4) + return size; + return (size + 3) & (~((uint)3)); + } + [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern static IntPtr StringToBSTR (string s); @@ -1036,25 +1051,21 @@ namespace System.Runtime.InteropServices { if (s == null) throw new ArgumentNullException ("s"); - int len = s.Length; - IntPtr ctm = AllocCoTaskMem ((len+1) * 2 + 4); - byte [] buffer = null; - WriteInt32 (ctm, 0, len*2); - try { - buffer = s.GetBuffer (); - for (int i = 0; i < len; i++) - WriteInt16 (ctm, 4 + (i * 2), (short) ((buffer [(i*2)] << 8) | (buffer [i*2+1]))); - WriteInt16 (ctm, 4 + buffer.Length, 0); - } finally { - if (buffer != null) - for (int i = buffer.Length; i > 0; ){ - i--; - buffer [i] = 0; - } + byte[] buffer = s.GetBuffer (); + int len = s.Length; + + // SecureString doesn't take endian-ness into account. + // Therefore swap bytes here before we send it to c-side if little-endian. + if (BitConverter.IsLittleEndian) { + for (int i = 0; i < buffer.Length; i += 2) { + byte b = buffer[i]; + buffer[i] = buffer[i + 1]; + buffer[i + 1] = b; + } } - return (IntPtr) ((long)ctm + 4); - } + return BufferToBSTR (buffer, len); + } public static IntPtr SecureStringToCoTaskMemAnsi (SecureString s) { @@ -1141,6 +1152,10 @@ namespace System.Runtime.InteropServices throw ex; } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + public extern static IntPtr BufferToBSTR (Array ptr, int slen); + [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern static IntPtr UnsafeAddrOfPinnedArrayElement (Array arr, int index); @@ -1576,7 +1591,7 @@ namespace System.Runtime.InteropServices } } - if (info is ManagedErrorInfo && ((ManagedErrorInfo) info).Exception.hresult == errorCode) { + if (info is ManagedErrorInfo && ((ManagedErrorInfo) info).Exception._HResult == errorCode) { return ((ManagedErrorInfo) info).Exception; } @@ -1649,5 +1664,9 @@ namespace System.Runtime.InteropServices return GetFunctionPointerForDelegateInternal ((Delegate)(object)d); } + + internal static void SetLastWin32Error (int error) + { + } } }