从byte[]动态加载程序集
本文关键字:加载 程序集 动态 byte | 更新日期: 2023-09-27 18:15:28
我需要在运行时多次从内存中加载几个程序集。我还需要一个可能性重新加载这些程序集后,对它们进行了一些更改。
我试过标准的汇编。加载方法,它工作得很好,直到我意识到当我再次加载相同的程序集时,它在
中出现了两次AppDomain.CurrentDomain.GetAssemblies()
这不是我想要完成的,因为有多个加载操作。我知道如果我从磁盘加载DLL,如果它以未更改的形式存在,它将无法加载。
然后我尝试加载dll到新的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,然后当我使它序列化,关于类型。
p。不幸的是,我不能在磁盘上保存dll文件。
我找到了工作解决方案。解决方案是使用:
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中这样做。