如何解决AppDomain中的重复程序集
我将WPF应用程序从.NET Framework 4.7移植到了.NET Core 3.1,但是我遇到了无法解决的问题。
我正在为某些应用逻辑使用单例。必须先初始化此单例,然后才能使用它。因此,在应用程序开始时,我将其创建为静态引用并对其进行初始化。到现在为止还挺好。我有一些在启动过程中反序列化的xml设置。我正在使用普通框架xml序列化器。我在OnDeserialized方法期间访问该单例。但是现在静态引用为空。静态构造函数被调用两次。因此,我尝试解决该问题,并注意到我的AppDomain包含多个程序集(在应用程序项目中引用的程序集),这些程序集具有相同的版本,相同的目标源文件。我不在任何地方执行手动组装加载。我还注意到,在命中OnDeserialized之前,框架执行了一些程序集加载,这导致重复的程序集加载到我的AppDomain中。在.NET Framework 4.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 { }
}
}
}
}
那我的问题是什么? 如何解决我的AppDomain中存在程序集重复且每个这样的程序集都有其自己的静态变量的事实。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。