예제 #1
0
        public unsafe int GetSignature(
            int bufferLength,
            out int count,
            [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0), Out] byte[] signature)
        {
            var localSignatureHandle = _symMethod.MetadataReader.GetMethodDebugInformation(_symMethod.DebugHandle).LocalSignature;
            var metadataImport       = _symMethod.SymReader.PdbReader.GetMetadataImport();
            var local = _symMethod.MetadataReader.GetLocalVariable(_handle);

            byte *signaturePtr;
            int   signatureLength;
            int   hr = metadataImport.GetSigFromToken(MetadataTokens.GetToken(localSignatureHandle), out signaturePtr, out signatureLength);

            if (hr != HResult.S_OK)
            {
                count = 0;
                return(hr);
            }

            var signatureReader = new BlobReader(signaturePtr, signatureLength);

            SignatureHeader header = signatureReader.ReadSignatureHeader();

            if (header.Kind != SignatureKind.LocalVariables)
            {
                count = 0;
                return(HResult.E_FAIL);
            }

            int slotCount = signatureReader.ReadCompressedInteger();
            int slotIndex = local.Index;

            if (slotIndex >= slotCount)
            {
                count = 0;
                return(HResult.E_FAIL);
            }

            var typeProvider = new DummyTypeProvider(_symMethod.MetadataReader);

            var decoder = new SignatureDecoder <object>(typeProvider);

            for (int i = 0; i < slotIndex - 1; i++)
            {
                decoder.DecodeType(ref signatureReader, allowTypeSpecifications: false);
            }

            int localSlotStart = signatureReader.Offset;

            decoder.DecodeType(ref signatureReader, allowTypeSpecifications: false);
            int localSlotLength = signatureReader.Offset - localSlotStart;

            if (localSlotLength <= bufferLength)
            {
                Marshal.Copy((IntPtr)(signaturePtr + localSlotStart), signature, 0, localSlotLength);
            }

            count = localSlotLength;
            return(HResult.S_OK);
        }
예제 #2
0
        public unsafe int GetSignature(
            int bufferLength,
            out int count,
            [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0), Out]byte[] signature)
        {
            var localSignatureHandle = _symMethod.MetadataReader.GetMethodBody(_symMethod.BodyHandle).LocalSignature;
            var metadataImport = _symMethod.SymReader.PdbReader.MetadataImport;
            var local = _symMethod.MetadataReader.GetLocalVariable(_handle);

            byte* signaturePtr;
            int signatureLength;
            int hr = metadataImport.GetSigFromToken(MetadataTokens.GetToken(localSignatureHandle), out signaturePtr, out signatureLength);
            if (hr != HResult.S_OK)
            {
                count = 0;
                return hr;
            }

            var signatureReader = new BlobReader(signaturePtr, signatureLength);

           SignatureHeader header = signatureReader.ReadSignatureHeader();
            if (header.Kind != SignatureKind.LocalVariables)
            {
                count = 0;
                return HResult.E_FAIL;
            }

            int slotCount = signatureReader.ReadCompressedInteger();
            int slotIndex = local.Index;
            if (slotIndex >= slotCount)
            {
                count = 0;
                return HResult.E_FAIL;
            }

            var typeProvider = new DummyTypeProvider(_symMethod.MetadataReader);

            for (int i = 0; i < slotIndex - 1; i++)
            {
                SignatureDecoder.DecodeType(ref signatureReader, typeProvider);
            }

            int localSlotStart = signatureReader.Offset;
            SignatureDecoder.DecodeType(ref signatureReader, typeProvider);
            int localSlotLength = signatureReader.Offset - localSlotStart;

            if (localSlotLength <= bufferLength)
            {
                Marshal.Copy((IntPtr)(signaturePtr + localSlotStart), signature, 0, localSlotLength);
            }

            count = localSlotLength;
            return HResult.S_OK;
        }