AppDomain中的重复程序集

问题描述

我将WPF应用程序从.NET Framework 4.7移植到了.NET Core 3.1,但是我遇到了无法解决的问题。

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

这里是简化的结构和代码,反映了我的真实实现。

项目结构和依赖项

project structure

应用启动

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 { }
            }
        }
    }
}

那我的问题是什么? 如何解决我的AppDomain中存在程序集重复且每个这样的程序集都有其自己的静态变量的事实。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...