public AssemblyExports ExtractExports(
            AssemblyDefinition assemblyDefinition,
            ExtractExportHandler exportFilter)
        {
            IList <TypeDefinition> typeDefinitionList = this.TraverseNestedTypes((ICollection <TypeDefinition>)assemblyDefinition.Modules.SelectMany <ModuleDefinition, TypeDefinition>((Func <ModuleDefinition, IEnumerable <TypeDefinition> >)(m => (IEnumerable <TypeDefinition>)m.Types)).ToList <TypeDefinition>());
            AssemblyExports        result             = new AssemblyExports()
            {
                InputValues = this.InputValues
            };

            foreach (TypeDefinition td in (IEnumerable <TypeDefinition>)typeDefinitionList)
            {
                List <ExportedMethod> exportMethods = new List <ExportedMethod>();
                foreach (MethodDefinition method in td.Methods)
                {
                    TypeDefinition typeRefCopy = td;
                    this.CheckForExportedMethods((Func <ExportedMethod>)(() => new ExportedMethod(this.GetExportedClass(typeRefCopy, result))), exportFilter, exportMethods, method);
                }
                foreach (ExportedMethod exportedMethod in exportMethods)
                {
                    this.GetExportedClass(td, result).Methods.Add(exportedMethod);
                }
            }
            result.Refresh();
            return(result);
        }
Пример #2
0
        public AssemblyExports ExtractExports(string fileName, ExtractExportHandler exportFilter)
        {
            string currentDirectory = Directory.GetCurrentDirectory();

            try
            {
                Directory.SetCurrentDirectory(Path.GetDirectoryName(fileName));
                return(this.ExtractExports(this.LoadAssembly(fileName), exportFilter));
            }
            finally
            {
                Directory.SetCurrentDirectory(currentDirectory);
            }
        }
        private void CheckForExportedMethods(
            Func <ExportedMethod> createExportMethod,
            ExtractExportHandler exportFilter,
            List <ExportedMethod> exportMethods,
            MethodDefinition mi)
        {
            IExportInfo exportInfo;

            if (!exportFilter(mi, out exportInfo))
            {
                return;
            }
            ExportedMethod exportedMethod = createExportMethod();

            exportedMethod.IsStatic  = mi.IsStatic;
            exportedMethod.IsGeneric = mi.HasGenericParameters;
            StringBuilder stringBuilder = new StringBuilder(mi.Name, mi.Name.Length + 5);

            if (mi.HasGenericParameters)
            {
                stringBuilder.Append("<");
                int num = 0;
                foreach (GenericParameter genericParameter in mi.GenericParameters)
                {
                    ++num;
                    if (num > 1)
                    {
                        stringBuilder.Append(",");
                    }
                    stringBuilder.Append(genericParameter.Name);
                }
                stringBuilder.Append(">");
            }
            exportedMethod.MemberName = stringBuilder.ToString();
            exportedMethod.AssignFrom(exportInfo);
            if (string.IsNullOrEmpty(exportedMethod.ExportName))
            {
                exportedMethod.ExportName = mi.Name;
            }
            if (exportedMethod.CallingConvention == (CallingConvention)0)
            {
                exportedMethod.CallingConvention = CallingConvention.Winapi;
            }
            exportMethods.Add(exportedMethod);
        }
Пример #4
0
        public AssemblyExports ExtractExports(string fileName, ExtractExportHandler exportFilter)
        {
            AssemblyDefinition def = null;
            string             currentDirectory = Directory.GetCurrentDirectory();

            try
            {
                Directory.SetCurrentDirectory(Path.GetDirectoryName(fileName));

                def = LoadAssembly(fileName);
                return(ExtractExports(def, exportFilter));
            }
            finally
            {
                Directory.SetCurrentDirectory(currentDirectory);
                def?.Dispose(); // 0.10.x
            }
        }