static void Main(string[] args)
        {
            string extensionFile = @"ReflectionExtension";
            var    assembly      = Assembly.Load(extensionFile);

            var  types         = assembly.GetTypes();
            Type extensionType = null;

            foreach (var type in types)
            {
                var interfaceType = type.GetInterface("IExtension");
                if (interfaceType != null)
                {
                    extensionType = type;
                    break;
                }
            }

            object extensionObject = null;

            if (extensionType != null)
            {
                extensionObject = Activator.CreateInstance(extensionType);
            }
            MethodInfo executeMethod         = extensionType.GetMethod("Execute");
            IExtension extensionViaInterface = extensionObject as IExtension;

            // Pre-execute to account for JIT
            executeMethod.Invoke(extensionObject, new object[] { 1, 2 });
            extensionViaInterface.Execute(1, 2);

            Stopwatch watch        = Stopwatch.StartNew();
            int       actualResult = 0;

            // Execute via MethodInfo.Invoke
            for (int i = 0; i < Iterations; i++)
            {
                object result = executeMethod.Invoke(extensionObject, new object[] { 1, 2 });
                actualResult = (int)result;
            }
            watch.Stop();
            Console.WriteLine("{0}, {1} ticks", actualResult, watch.ElapsedTicks);

            // Execute via interface
            watch.Restart();
            for (int i = 0; i < Iterations; i++)
            {
                actualResult = extensionViaInterface.Execute(1, 2);
            }
            watch.Stop();
            Console.WriteLine("{0}, {1} ticks", actualResult, watch.ElapsedTicks);
        }
Esempio n. 2
0
 /// <summary>
 /// 启动扩展服务
 /// </summary>
 /// <param name="extensions"></param>
 private void ExtensionExecute(IEnumerable <string> extensions)
 {
     foreach (string extension in extensions)
     {
         IExtension ex = ReflectionOptimizer.CreateInstanceMethod(extension)() as IExtension;
         if (ex != null)
         {
             ex.Execute();
         }
     }
 }