示例#1
0
        /// <summary>
        /// Find the Method for this method on the given type.
        /// </summary>
        internal Method findMethod(string qname, string methodName, string[] paramTypes, string returnType)
        {
            string key    = getMethodKey(qname, methodName, paramTypes);
            Method method = (Method)methods[key];

            if (method == null)
            {
                // this stuff should be the same for both cases
                PERWAPI.Type   rtype = findType(returnType);
                PERWAPI.Type[] pars  = new PERWAPI.Type[paramTypes.Length];
                for (int i = 0; i < paramTypes.Length; i++)
                {
                    pars[i] = findType(paramTypes[i]);
                }

                // check for stubs
                object obj = findType(qname);
                if (obj is ClassDef)
                {
                    // class is an internal stub, so we need to stub this
                    // method out too, which should get flushed out later
                    ClassDef cdef = obj as ClassDef;

                    // TODO - need to fix attrs
                    Param[] mpars = new Param[pars.Length];
                    for (int i = 0; i < mpars.Length; i++)
                    {
                        mpars[i] = new Param(ParamAttr.Default, "v" + i, pars[i]);
                    }

                    // TODO - fix param names
                    // Use Public here for stub - real MethAttr will be set
                    // when method is flushed out
                    method = cdef.AddMethod(MethAttr.Public, ImplAttr.IL, methodName, rtype, mpars);
                }
                else if (obj is ClassRef)
                {
                    // class is external, just get or add ref
                    ClassRef cref = obj as ClassRef;
                    method = cref.GetMethod(methodName, pars, new PERWAPI.Type[0]);
                    if (method == null)
                    {
                        method = cref.AddMethod(methodName, rtype, pars);
                    }
                }
                else
                {
                    throw new System.Exception("Don't know how to handle: " + obj.GetType());
                }

                // make sure we add method to hashtable
                methods[key] = method;
            }

            return(method);
        }
示例#2
0
        //public static bool LocateLoggerMethods(PEFile file, string assemblyName, string className, out Method startLogMethod, out Method endLogMethod)
        //{

        //    startLogMethod = endLogMethod = null;

        //    // Check if it is in this assembly itself
        //    if (file.GetThisAssembly().Name() == assemblyName)
        //    {
        //        ClassDef methodLogger = file.GetClass(className);

        //        if (methodLogger != null)
        //        {
        //            return GetLoggerMethodsFromClass(methodLogger, out startLogMethod, out endLogMethod);
        //        }
        //    }

        //    // Check referenced assemblies
        //    foreach (AssemblyRef assemblyRef in file.GetImportedAssemblies())
        //    {
        //        if (assemblyRef.Name() == assemblyName)
        //        {
        //            ClassRef methodLoggerRef = TryGetMethodLoggerFromAssembly(assemblyRef, className);
        //            if (methodLoggerRef != null)
        //            {
        //                if (GetLoggerMethodsFromClass(methodLoggerRef, out startLogMethod, out endLogMethod))
        //                    return true;
        //            }
        //        }
        //    }

        //    // Not found in this assembly or referenced assemblies. Try loading given assembly and adding it as reference
        //    AssemblyRef newAssemblyRef = file.MakeExternAssembly(assemblyName);
        //    ClassRef newMethodLoggerRef = TryGetMethodLoggerFromAssembly(newAssemblyRef, className);
        //    if (newMethodLoggerRef != null)
        //    {
        //        if (GetLoggerMethodsFromClass(newMethodLoggerRef, out startLogMethod, out endLogMethod))
        //            return true;
        //    }
        //    return false;
        //}

        private static ClassRef TryGetMethodLoggerFromAssembly(PEFile pef, AssemblyRef assemblyRef, string className)
        {
            //string fileName = "";
            //if (assemblyRef.Name().ToLower().EndsWith(".dll")|| assemblyRef.Name().ToLower().EndsWith(".exe"))
            //    fileName = assemblyRef.Name();
            //else
            // fileName = assemblyRef.Name() + ".exe";
            ////Console.WriteLine("TryGetMethodLoggerFromAssembly ->" + fileName);
            //if (!System.IO.File.Exists(fileName))
            //{
            //    Console.WriteLine(fileName + " not present in current directory. Skipping it in search");
            //    return null;
            //}



            PEFile   refFile      = pef;//PEFile.ReadPEFile(fileName);
            ClassDef methodLogger = refFile.GetClass(className);

            if (methodLogger != null)
            {
                ClassRef methodLoggerRef = methodLogger.MakeRefOf();
                if (assemblyRef.GetClass(className) == null)
                {
                    assemblyRef.AddClass(methodLoggerRef);
                }

                System.Array.ForEach(methodLogger.GetMethods(), delegate(MethodDef methodDef)
                {
                    if (methodLoggerRef.GetMethod(methodDef.Name()) == null)
                    {
                        methodLoggerRef.AddMethod(methodDef.Name(), methodDef.GetRetType(), methodDef.GetParTypes());
                    }
                });
                return(methodLoggerRef);
            }
            return(null);
        }