private static String uncompressString(byte[] buffer, ref int offset) { uint length = SignatureBuffer.uncompressInt(buffer, ref offset); int oldOffset = offset; offset += (int)length; return(MetaDataLoader.stringEncoding.GetString(buffer, oldOffset, (int)length)); }
// Constructor Methods internal static MarshalSpec Create(byte[] buffer) { int offset = 0; NativeTypes kind = (NativeTypes) SignatureBuffer.uncompressInt(buffer, ref offset); switch (kind) { case NativeTypes.BOOLEAN: case NativeTypes.I1: case NativeTypes.U1: case NativeTypes.I2: case NativeTypes.U2: case NativeTypes.I4: case NativeTypes.U4: case NativeTypes.I8: case NativeTypes.U8: case NativeTypes.R4: case NativeTypes.R8: case NativeTypes.CURRENCY: case NativeTypes.BSTR: case NativeTypes.LPSTR: case NativeTypes.LPWSTR: case NativeTypes.LPTSTR: case NativeTypes.IUNKNOWN: case NativeTypes.IDISPATCH: case NativeTypes.STRUCT: case NativeTypes.INTF: case NativeTypes.INT: case NativeTypes.UINT: case NativeTypes.BYVALSTR: case NativeTypes.ANSIBSTR: case NativeTypes.TBSTR: case NativeTypes.VARIANTBOOL: case NativeTypes.FUNC: case NativeTypes.ASANY: case NativeTypes.LPSTRUCT: case NativeTypes.ERROR: case NativeTypes.MAX: { if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecNative(kind)); } case NativeTypes.SAFEARRAY: { VariantTypes elemType; if (offset < buffer.Length) { elemType = (VariantTypes) SignatureBuffer.uncompressInt(buffer, ref offset); } else { elemType = VariantTypes.VT_EMPTY; } if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecSafeArray(elemType)); } case NativeTypes.FIXEDSYSSTRING: { uint elemCount = SignatureBuffer.uncompressInt(buffer, ref offset); if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecFixedString(elemCount)); } case NativeTypes.FIXEDARRAY: { uint elemCount = SignatureBuffer.uncompressInt(buffer, ref offset); if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecFixedArray(elemCount)); } case NativeTypes.CUSTOMMARSHALER: { String guid = uncompressString(buffer, ref offset); String unmanagedType = uncompressString(buffer, ref offset); String managedType = uncompressString(buffer, ref offset); String cookie = uncompressString(buffer, ref offset); if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecCustom(guid, unmanagedType, managedType, cookie)); } case NativeTypes.ARRAY: { NativeTypes elemType = (NativeTypes) SignatureBuffer.uncompressInt(buffer, ref offset); uint paramNumber = ((offset < buffer.Length) ? SignatureBuffer.uncompressInt(buffer, ref offset) : 0); uint extras = ((offset < buffer.Length) ? SignatureBuffer.uncompressInt(buffer, ref offset) : 0); if (offset != buffer.Length) { Console.WriteLine("WARNING: extra bytes in " + new MetaDataBlob(buffer)); } return(new MarshalSpecArray(elemType, paramNumber, extras)); } default: { throw new Exception("Unknown marshal spec kind " + kind); } } }