我需要在运行时多次从内存中加载多个程序集。在对它们进行一些更改之后,我还需要重新加载这些程序集。
我已经尝试过标准的 Assembly.Load 方法,它工作正常,直到我意识到当我再次加载相同的程序集时,它出现了两次
AppDomain.CurrentDomain.GetAssemblies()
这不是我想要完成的多次加载操作。我知道如果我将从磁盘加载DLL,如果它以不变的形式存在,它将无法加载。
然后我尝试将DLL加载到 new AppDomain 中,但我遇到了依赖项问题。
以下是简化方案:
我有共享DLL,称之为AssemblyA,由主应用程序引用。
我还有几个我想动态加载的DLL(称之为AssemblyB ... Z)。这些DLL也引用AssemblyA。
我的主要应用程序,如上所述,引用AssemblyA,它具有抽象类和主应用程序实现的方法(称为LoadAssemblies)。此方法用于通过新的AppDomain动态加载其余程序集。
这是LoadAssemblies的当前代码(我尝试手动加载依赖项):
public override void LoadAssemblies()
{
AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain");
foreach (byte[] xmlDLL in listOfDLLS)
{
Assembly reflection = Assembly.ReflectionOnlyLoad(xmlDLL);
foreach (var dependencies in reflection.GetReferencedAssemblies())
{
if (dependencies.Name.Equals("AssemblyA"))
{
Assembly pluginr = Assembly.ReflectionOnlyLoad(AssemblyA);
foreach (var d in pluginr.GetReferencedAssemblies())
pluginDomain.Load(d);
pluginDomain.Load(plugin);
}
else
pluginDomain.Load(dependencies);
}
Assembly assembly = pluginDomain.Load(xmlDLL);
}
上面的代码在线上出现错误
Assembly assembly = pluginDomain.Load(xmlDLL);
说出来:
could not load assembly or one of its dependencies
还尝试使用AssemblyResolver事件,但它抱怨Serializable,然后当我将其序列化时,关于类型。
PS。不幸的是我无法将DLL保存在磁盘上。
答案 0 :(得分:0)
我找到了解决方法。解决方案是使用:
pluginDomain.SetData("Assembly", DLLinByteArray);
pluginDomain.DoCallBack(CallbackFunction)
每当我需要在自定义AppDomain中执行某些操作时。
例如,从字节数组加载DLL, CallbackFunction 如下所示:
byte[] assemblyToLoad = (byte[])AppDomain.CurrentDomain.GetData("Assembly");
Assembly.Load(assemblyToLoad);
如您所见,我使用 SetData 和 GetData 方法将参数发送到回调方法。
当然,对于驻留在自定义AppDomain中的DLL调用方法,我在另一个 CallbackFunction 中执行此操作。