对已加载程序集的引用
本文关键字:引用 程序集 加载 | 更新日期: 2023-09-27 18:04:28
我不知道如何最好地描述这一点。但是我在理解程序集的加载过程上有一个问题。
我的应用程序通过反射使用插件。它工作得很好,我对此很满意。现在我偶然发现了一个让我困惑的问题,我想我错过了一些东西:
在一个模块中,我引用了另一个模块。在运行时加载所有模块。有模块ClientManager和调用模块计算。ClientManager和computation都被加载。计算引用ClientManager。当计算试图加载一个类的ClientManager我得到一个文件未找到异常。
这两个程序集都是从内存中的字节流加载的(通过Assembly.Load(byte[]))。
当计算尝试加载ClientManager类时,它看起来是这样的:
loaded: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
更多的程序集…
加载:ClientManager, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
加载:计算,版本=1.0.0.0,文化=中性,PublicKeyToken=null
要加载的程序集名称:ClientManager,版本=1.0.0.0,文化=中性,PublicKeyToken=null
请求来自:计算,版本=1.0.0.0,文化=中性,PublicKeyToken=null
因此,程序集被加载,但它被请求并且请求失败。我错过了什么?我必须装两次组装吗?
我很感激你的帮助。
,
Skalli
您的问题看起来与我在开发插件时遇到的问题非常相似:Visual Studio在哪里寻找程序集?
我认为你应该首先了解。net在哪里寻找你的程序集,并将其与已经加载在AppDomain中的程序集进行比较。这可以使用ProcMon.exe来查看您的应用程序无法找到程序集的地方,并查看您可以在AppDomain.CurrentDomain.GetAssemblies()中找到的ClientManager的CodeBase属性。
我想这两个路径将是不同的,但很难想象为什么你的应用程序在不知道它们的情况下在不同的地方寻找程序集。
最后,我使用AssemblyResolve事件也解决了我的问题,只是在当前加载的程序集中查找我的程序集,然后返回它(不再次加载)。
我是这样做的。我不确定它是否真的很整洁,因为它只在未找到的程序集已经加载时才起作用:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
foreach (Assembly anAssembly in AppDomain.CurrentDomain.GetAssemblies())
if (anAssembly.FullName == args.Name)
return anAssembly;
return null;
}