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