C# AppDomain中存在重复的程序集

C# AppDomain中存在重复的程序集,c#,wpf,.net-assembly,appdomain,.net-core-3.1,C#,Wpf,.net Assembly,Appdomain,.net Core 3.1,我将我的WPF应用程序从.NETFramework 4.7移植到.NETCore3.1,但我面临无法解决的问题 我正在使用singleton进行一些应用程序逻辑。需要先初始化此单例,然后才能使用它。因此,在应用程序开始时,我将其创建为静态引用并对其进行初始化。到现在为止,一直都还不错。我有一些在启动过程中反序列化的xml设置。我使用的是普通的框架xml序列化程序。我在序列化方法期间访问该单例。但是现在静态引用为null。静态构造函数被调用两次。所以我试图解决这个问题,我注意到我的AppDomai

我将我的WPF应用程序从.NETFramework 4.7移植到.NETCore3.1,但我面临无法解决的问题

我正在使用singleton进行一些应用程序逻辑。需要先初始化此单例,然后才能使用它。因此,在应用程序开始时,我将其创建为静态引用并对其进行初始化。到现在为止,一直都还不错。我有一些在启动过程中反序列化的xml设置。我使用的是普通的框架xml序列化程序。我在序列化方法期间访问该单例。但是现在静态引用为null。静态构造函数被调用两次。所以我试图解决这个问题,我注意到我的AppDomain包含多个程序集(我在应用程序项目中引用的程序集),它们具有相同的版本和相同的目标源文件。我不在任何地方执行手动装配加载。我还注意到,就在OnDeserialized被命中之前,框架执行了一些程序集加载,导致重复的程序集加载到我的AppDomain。它在.NETFramework4.7下正常工作

下面是反映我实际实现的简化结构和代码

项目结构和依赖关系

应用程序启动

public MainWindow()
{
    InitializeComponent();

    var resource = CreateResourceSingleton();
    resource.Initialize();

    LoadSettings();
}
部分设置

[OnDeserialized]
private void OnDeserialized(StreamingContext c)
{
    AccessSingleton();
}
知道为什么会这样吗

我发现我可以通过手动遍历程序集引用树并在启动时加载所有程序集(这里必须允许重复的程序集,否则它将不起作用)来解决这个问题,但这对性能影响很大,因为它在AppDomain中加载了数百个程序集。然后,它甚至可以与域内的副本一起工作

public void PreloadAssemblies()
{
    var loadedAssemblies = new List<string>();
    var assembliesToCheck = new Queue<System.Reflection.Assembly>();

    assembliesToCheck.Enqueue(System.Reflection.Assembly.GetEntryAssembly());

    while (assembliesToCheck.Any())
    {
        var assemblyToCheck = assembliesToCheck.Dequeue();

        foreach (var reference in assemblyToCheck.GetReferencedAssemblies())
        {
            if (!loadedAssemblies.Contains(reference.FullName))
            {
                try
                {
                    var assembly = System.Reflection.Assembly.Load(reference);
                    assembliesToCheck.Enqueue(assembly);
                    loadedAssemblies.Add(reference.FullName);
                }
                catch { }
            }
        }
    }
}
public-void预加载程序集()
{
var loadeAssemblies=新列表();
var assembliesToCheck=新队列();
assembliesToCheck.Enqueue(System.Reflection.Assembly.GetEntryAssembly());
while(assembliesToCheck.Any())
{
var assemblyToCheck=assembliesToCheck.Dequeue();
foreach(assemblyToCheck.GetReferencedAssemblys()中的变量引用)
{
如果(!loadedAssemblies.Contains(reference.FullName))
{
尝试
{
var assembly=System.Reflection.assembly.Load(参考);
assembliesToCheck.Enqueue(assembly);
loadedAssemblies.Add(reference.FullName);
}
捕获{}
}
}
}
}
那么我的问题是什么?
如何避免在我的AppDomain中存在重复的程序集,并且每个程序集都有自己的静态变量。

这相当复杂,那么您最直接的问题是什么。。。你有itI的代码吗?我添加了一些附加信息