使用动态DLL加载时,单例不是唯一的

时间:2014-01-21 14:36:51

标签: c# singleton

我面临单身人士的麻烦。

从应用程序和通过不同类加载器加载的自定义dll调用此单例。

这就像我最终有两个不同的Singleton类实例......

我对Singleton的实现是:

protected static SingletonImplementation instance = null;
protected static readonly object padLock = new object();

public static SingletonImplementation Instance
{
  get
  {
    lock (padLock)
    {
      if (instance == null)
      {
        instance = new SingletonImplementation();
      }

      return instance;
    }
  }
}

private SingletonImplementation()
{}

解决方案A定义了Singleton并使用它。应用程序A创建另一个DLL,该DLL调用此Singleton并由应用程序A动态加载。

我的应用程序正在扫描文件夹以查找可以使用以下代码段加载的所有dll:

string[] l_asDlls = Directory.GetFiles(l_sDirectory, sAssemblySearchPattern, SearchOption.TopDirectoryOnly);
foreach (string l_sFileName in l_asDlls)
{
    Assembly l_assembly = Assembly.LoadFile(Environment.CurrentDirectory + Path.DirectorySeparatorChar + l_sFileName);
    Type[] l_aTypes = l_assembly.GetExportedTypes();

    foreach (Type l_type in l_aTypes)
    {            
           lstRemoteCommandServer.Add((ClassBase)Activator.CreateInstance(l_type, this, l_sRepositoryDirectory));
    }
}

在其中一个已经通过上一个代码段加载的DLL中,其中一个调用了我的Singleton,而且应用程序A所拥有的Singleton似乎是DLL所具有的Singleton的不同实例。

我如何设法纠正这个错误/行为?

1 个答案:

答案 0 :(得分:1)

错误是加载动态装配时。要加载到同一个AppDomain中,请使用以下方法:

Assembly l_assembly = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(Environment.CurrentDirectory + Path.DirectorySeparatorChar + l_sFileName));