//using System;
//using System.Collections.Generic;
//using System.ComponentModel.Composition;
//using System.ComponentModel.Composition.Hosting;
//using System.Linq;
//using System.Reflection;
//using System.Text;
//using Microsoft.Scripting.Hosting;

//namespace CoverageFramework
//{
//    class _Program
//    {
//        [Import]
//        public IEnumerable<IMessageSender> MessageSender { get; set; }

//        static readonly ScriptRuntime runtime = ScriptRuntime.CreateFromConfiguration();

//        static CompiledCode GetCompiledCode(string path)
//        {
//            var ext = System.IO.Path.GetExtension(path).Replace(".", "");
//            var engine = runtime.GetEngine(ext);
//            return engine.CreateScriptSourceFromFile(path).Compile();
//        }

//        static void Main2(string[] args)
//        {
//            var catalog = new AggregateCatalog();
//            //catalog.Catalogs.Add(new AttributedAssemblyPartCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
//            catalog.Catalogs.Add(new DirectoryCatalog("Extentions"));
//            var container = new CompositionContainer(catalog);
//            var batch = new CompositionBatch();

//            var program = new _Program();
//            batch.AddPart(program);
//            container.Compose(batch);

//            foreach(var sender in program.MessageSender)
//            {
//                sender.Send("abc");
//            }

//            ExecuteSum("sum.py", new[] { 0, 1, 2, 3 });
//            ExecuteSum("sum.rb", new[] { 0, 1, 2, 3 });
//        }

//        static void ExecuteSum(string path, IEnumerable<int> list)
//        {
//            var compiled = GetCompiledCode(path);
//            var scope = runtime.CreateScope();

//            scope.SetVariable("arg", list);
//            // ↑ 引数を渡す機能とかないみたい？なので、変数として値をセット。

//            object result = compiled.Execute(scope);
//            // ↑ IronPython だとこれで戻り値を返せない。

//            if (result == null)
//            {
//                result = scope.GetVariable("result");
//                // ↑ 逆に、IronRuby だと、result 変数が scope に残らない。
//            }

//            Console.Write("{0}, {1}\n", result, result.GetType().Name);
//            // ↑ 55, Int32 って表示されるはず
//        }
//    }

//    public interface IMessageSender
//    {
//        void Send(string message);
//    }

//    [Export(typeof(IMessageSender))]
//    public class EmailSender : IMessageSender
//    {
//        public void Send(string message)
//        {
//            Console.WriteLine(message);
//        }
//    }
//}
