Windows 带MEF集成的Autofac

Windows 带MEF集成的Autofac,windows,service,mef,autofac,Windows,Service,Mef,Autofac,我需要帮助。我使用Autofac容器创建Windows服务。 我使用MEF集成服务为我的服务创建几个可选组件 例如: 单元1 [Export(typeof(IClass1))] public class Class1 : IClass1 { public void Show() { Console.WriteLine("Hallo from Class1"); } } 单元2 [Export(typ

我需要帮助。我使用Autofac容器创建Windows服务。 我使用MEF集成服务为我的服务创建几个可选组件

例如:

单元1

  [Export(typeof(IClass1))]
  public class Class1 : IClass1
  {
        public void Show()
        {
              Console.WriteLine("Hallo from Class1");
        }
  }
单元2

  [Export(typeof(IClass2))]
  public class Class2 : IClass2
  {
        public void Show()
        {
              Console.WriteLine("Hallo from Class2");
        }
  }
模块集成的基本类-示例

  class Program
  {
        private static IContainer Container { get; set; }

        static void Main(string[] args)
        {

              // Create your builder.
              var builder = new ContainerBuilder();

              /** find all modules in selected folder */
              var catalog = new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\modules", "*Module.dll");

              /** register finded modules */
              builder.RegisterComposablePartCatalog(catalog);


              builder.RegisterType<MyClass>().As<IMyClass>().SingleInstance();

              Container = builder.Build();

              var cls = Container.Resolve<IMyClass>();

              cls.Show();

              Console.WriteLine("Class ready. Press Enter");
              Console.ReadKey(true);
        }
  }


  class MyClass: IMyClass
  {
        private readonly IClass1 _class1;
        private readonly IClass1 _class3;


        private readonly IClass2 _class2;
        private readonly IClass2 _class4;

        public MyClass(IClass1 class1, IClass2 class2)
        {
              _class1 = class1;
              _class2 = class2;

              _class3 = class1;
              _class4 = class2;
        }

        public void Show()
        {
              _class1.Show();

              Console.WriteLine("Class1 ready. Press Enter");
              Console.ReadKey(true);

              _class2.Show();

              Console.WriteLine("Class1 ready. Press Enter");
              Console.ReadKey(true);
        }
  }

  internal interface IMyClass
  {
        void Show();
  }
类程序
{
专用静态IContainer容器{get;set;}
静态void Main(字符串[]参数)
{
//创建您的生成器。
var builder=new ContainerBuilder();
/**查找所选文件夹中的所有模块*/
var catalog=new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)+@“\modules”,“*Module.dll”);
/**寄存器翅片模块*/
builder.RegisterComposablePartCatalog(目录);
builder.RegisterType().As().SingleInstance();
Container=builder.Build();
var cls=Container.Resolve();
cls.Show();
Console.WriteLine(“类就绪。按Enter键”);
Console.ReadKey(true);
}
}
类MyClass:IMyClass
{
私有只读IClass1_class1;
私有只读IClass1_class3;
私有只读IClass2_class2;
私有只读IClass2_class4;
公共MyClass(IClass1类,IClass2类)
{
_class1=class1;
_类别2=类别2;
_类别3=类别1;
_类别4=类别2;
}
公开展览(
{
_类别1.Show();
Console.WriteLine(“Class1就绪,按Enter键”);
Console.ReadKey(true);
_class2.Show();
Console.WriteLine(“Class1就绪,按Enter键”);
Console.ReadKey(true);
}
}
内部接口IMyClass
{
void Show();
}
在这个例子中,一切都很好。这是我在服务中使用的原则。对于测试启动和调试我的服务,我使用Nuget packages存储库中的service.Helper。 每个人都很好。 但是如果我提前创建安装包安装程序并在系统(Windows 8.1 x64)中安装我的服务,则服务不会启动。 记录系统事件日志中服务写入System.ArgumentNullException的异常。此行中最有可能出现异常

builder.RegisterComposablePartCatalog(目录)


服务不从开始文件夹加载任何模块。拒绝从服务访问他的子文件夹。请帮忙。谢谢。

尝试Assembly.GetEntryAssembly().Location而不是Assembly.GetExecutionGassembly().Location