从byte []动态加载程序集

时间:2016-10-28 15:04:57

标签: c# load runtime .net-assembly appdomain

我需要在运行时多次从内存中加载多个程序集。在对它们进行一些更改之后,我还需要重新加载这些程序集

我已经尝试过标准的 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保存在磁盘上。

1 个答案:

答案 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 中执行此操作。