예제 #1
0
        internal static ClassRef AddClass(AssemblyRef assembly, string ns, string name)
        {
            ClassRef klass = assembly.GetClass(ns, name);

            if (klass != null)
            {
                return(klass);
            }
            else
            {
                return(assembly.AddClass(ns, name));
            }
        }
예제 #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);
        }
예제 #3
0
        //////////////////////////////////////////////////////////////////////////
        // Util
        //////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Find the Type instance for this fully qualified type name.
        /// </summary>
        internal PERWAPI.Type findType(string qname)
        {
            // Always convert voids to native
            if (qname == "Fan.Sys.Void")
            {
                qname = "System.Void";
            }

            PERWAPI.Type type = (PERWAPI.Type)types[qname];
            if (type == null)
            {
                string aname = FanUtil.getPodName(qname);
                if (aname == null)
                {
                    aname = "mscorlib";
                }
                if (qname.StartsWith("Fanx."))
                {
                    aname = "sys";                       // hack for support classes
                }
                if (qname.EndsWith("Peer"))
                {
                    aname += "Native_";                  // TODO
                }
                // first check if this is a type in this pod that
                // hasn't been defined yet
                if (aname == assemblyName)
                {
                    // stub out type - fill get filled in later (we hope)
                    string[] sn   = FanUtil.splitQName(qname);
                    ClassDef stub = null;
                    if (qname.IndexOf("/") != -1)
                    {
                        // Nested class
                        PERWAPI.ClassDef cdef = (PERWAPI.ClassDef)findType(sn[0]);
                        stub = cdef.AddNestedClass(PERWAPI.TypeAttr.NestedPublic, sn[1]);
                    }
                    else
                    {
                        // Normal class
                        stub = peFile.AddClass(PERWAPI.TypeAttr.Public, sn[0], sn[1]);
                    }
                    types[qname] = stub;
                    return(stub);
                }

                AssemblyRef aref = (AssemblyRef)assemblies[aname];
                if (aref == null)
                {
                    aref = peFile.MakeExternAssembly(aname);
                    assemblies[aname] = aref;
                }

                string[] s = FanUtil.splitQName(qname);
                if (qname.IndexOf("/") != -1)
                {
                    // Nested class
                    PERWAPI.ClassRef cref = (PERWAPI.ClassRef)findType(s[0]);
                    type = cref.AddNestedClass(s[1]);
                }

                /*
                 * else if (qname.IndexOf("<") != -1)
                 * {
                 * // Generic type
                 * //if (type == null) type = aref.AddClass(s[0], s[1]);
                 * PERWAPI.ClassRef cref = (PERWAPI.ClassRef)findType(s[0]);
                 * cref.SetGenericParams(new GenericParam[] { cref.GetGenericParam(0) });
                 * type = cref;
                 * }
                 */
                else
                {
                    // Normal class, get/add type
                    type = aref.GetClass(s[0], s[1]);
                    if (type == null)
                    {
                        type = aref.AddClass(s[0], s[1]);
                    }
                }
                types[qname] = type;
            }
            return(type);
        }