如何在单独的AppDomain和非默认域中加载程序集

时间:2014-12-18 18:21:53

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

过去几天我一直在搜索如何在一个单独的应用程序域中加载一个程序集而不是默认的程序集,我找不到如何这样做的答案。我将简要解释一下我尝试过的大多数事情。

  1. 我已经使用了CreateInstanceFromAndUnwrap,这很有用......但大多数情况下这个方法存在两个问题。第一个问题是,当我调用newDomain.GetAssemblies()时,我得到一个FileNotFoundException,解决此异常的唯一方法是实现AppDomain.CurrentDomain.AssemblyResolve。这个问题是它将程序集加载到默认域,这意味着我无法卸载程序集。第二个问题是我在正在运行的程序集中有一个名为Task的基本抽象类,我在其他程序集中有从Task派生的子类。我打电话的时候 var obj = newDomain.CreateInstanceFromAndUnwrap(param1, param2)它返回一个MarshalByRefObject(它应该)但是当我把它转换为抽象类时: var obj = (Task)newDomain.CreateInstanceFromAndUnwrap(param1, param2),obj的类型是“任务”。 现在我知道它是ChildTask的一个实例,但是它说类型是Task,我需要类型为ChildTask但是我不能将它转换为ChildTask而不将程序集加载到默认域中。

  2. 我创建了一个继承自MarshalByRefObject的Proxy类,并在Proxy类中加载了Assembly(正如本主题中的许多答案所示),但它只是将程序集加载到默认域而不是创造了一个。因此,一旦我完成它,就不允许我卸载它。

  3. 我使用newDomain.DoCallback(CallbackMethod)来加载没有新appdomain的程序集。问题是,一旦方法执行完毕,Callback方法中所做的更改对默认域没有影响,例如:

    public void DoSomething()
    {
        newDomain.DoCallback(CallbackMethod)
        Type type = newDomain.GetData("TYPE") // This returns null (as if nothing happened in     CallbackMethod)
    }
    
    public void CallbackMethod()
    {
        newDomain.SetData("TYPE", newDomain.CreateInstanceFromAndUnwrap(param1,   param2).GetType())
    } // At this point "TYPE" will be set to ChildTask
    
  4. 这是有道理的,因为它们位于不同的域中,因此一个域中的更改不应影响另一个域。我不知道如何允许它们相互交互,以便我可以从CallbackMethod()获得一个设定值

    1. 我使用过newDomain.Load()(即使它已被弃用),即使使用AppDomainSetup

    2. ,我也会收到FileNotFoundException
    3. 我尝试过使用序列化,但我不断收到一堆序列化异常,说明无法解析Type等,修复这些异常的唯一方法是使用Assembly Resolve将程序集加载到默认域名。

    4. 有什么我想念的吗?我真正想做的就是能够将程序集加载到一个新的appdomain并从该程序集中获取一个类型,但似乎我无法加载程序集,除非它们被加载到默认域中。是否有可能做到这一点?或者我只需要找到解决方法吗?

0 个答案:

没有答案