从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文件。

从byte[]动态加载程序集

我找到了工作解决方案。解决方案是使用:

pluginDomain.SetData("Assembly", DLLinByteArray);
pluginDomain.DoCallBack(CallbackFunction)

当我需要在自定义AppDomain内执行某些操作时。

例如,从字节数组加载dll, CallbackFunction看起来像这样:
byte[] assemblyToLoad = (byte[])AppDomain.CurrentDomain.GetData("Assembly");
Assembly.Load(assemblyToLoad);

你可以看到我使用SetDataGetData方法发送参数回调方法。

当然,对于从驻留在自定义AppDomain的DLL中调用方法,我在另一个CallbackFunction中这样做。