using System;
using System.Collections;
using System.Text;
using System.Runtime.InteropServices;
namespace AnticipatingMinds.PlatformServices.UnmanagedReflection{
/// <summary>
/// Summary description for MethodInfo.
/// </summary>
public class MethodInfo : MemberInfo
{
public MethodInfo(AssemblyInfo assemblyInfo, uint methodToken):base(assemblyInfo, methodToken)
{
uint uintTemp;
if((methodToken & (uint)CorTokenType.mdtMethodDef) != 0)
{
IntPtr signatureBlobPtr;
int signatureBlobSize;
int nameLength = 0;
assemblyInfo.MetadataImport.GetMethodProps(methodToken,out uintTemp,null,0,out nameLength,out methodAttributes,out signatureBlobPtr,out signatureBlobSize,out uintTemp,out uintTemp);
StringBuilder nameBuilder = new StringBuilder(nameLength);
assemblyInfo.MetadataImport.GetMethodProps(methodToken,out uintTemp,nameBuilder,nameBuilder.Capacity+1,out nameLength,out methodAttributes,out signatureBlobPtr,out signatureBlobSize,out uintTemp,out uintTemp);
name = nameBuilder.ToString();
byte[] signature = new byte[signatureBlobSize];
Marshal.Copy(signatureBlobPtr,signature,0,signatureBlobSize);
if(CorAttributes == System.Reflection.MethodAttributes.PrivateScope)
{
parameters = new ParameterInfo[0];
return;
}
int cursor = 0;
uint callingConvention = CorSigUncompressData(signature, ref cursor);
uint paramCount = CorSigUncompressData(signature, ref cursor);
returnType = DecodeType(signature, ref cursor);
parameters = new ParameterInfo[paramCount];
int intTemp = 0;
uint[] paramTokens = new uint[paramCount];
uint hParamsEnum = 0;
assemblyInfo.MetadataImport.EnumParams(ref hParamsEnum,methodToken,paramTokens,paramTokens.Length,out intTemp);
assemblyInfo.MetadataImport.CloseEnum(hParamsEnum);
for(int i = 0; i < paramCount; i++)
{
parameters[i] = new ParameterInfo(assemblyInfo,paramTokens[i],DecodeType(signature, ref cursor));
}
}
if((methodToken & (uint)CorTokenType.mdtMemberRef) != 0)
{
}
}
public string ReturnType
{
get
{
return returnType;
}
}
public ParameterInfo[] Parameters
{
get
{
return parameters;
}
}
public System.Reflection.MethodAttributes CorAttributes
{
get
{
return (System.Reflection.MethodAttributes) methodAttributes;
}
}
public string Name
{
get
{
return name;
}
}
string name;
uint methodAttributes = 0;
private string returnType;
private ParameterInfo[] parameters;
}
}
|