如何在一个AppDomain中创建一个Type,但在另一个AppDomain中是未知的?

时间:2009-12-17 22:24:05

标签: .net appdomain

我的问题很简单。出于单元测试的目的,我需要一个从Exception类型派生的静态编译类型,它在一个AppDomain中是已知的,但在另一个AppDomain中是未知的。

一个简单的解决方案是:

  1. 在应用程序可执行文件的目录下创建子文件夹。
  2. 在那里放置一个带有一些Exception派生类型的程序集。
  3. 更新app.config文件,将此文件夹添加到探测路径。
  4. 创建一个新的AppDomain,但app.config略有不同 - 没有元素。
  5. 现在,主AppDomain可以轻松加载类型,因为它的位置在探测路径中,但第二个AppDomain无法完成任务。

    但这种方法需要:

    • 附加文件夹
    • 虚拟装配
    • 虚拟应用配置文件

    我想知道我是否可以更简单地实现我的目标,但没有Reflection.Emit。

    感谢。

    修改

    任何Exception派生类型都可以。

    动机:

    我们有一个分布式应用程序,包括客户端,服务器和代理。有专门在代理上找到的程序集,并且有些程序专门在服务器上找到。部署新功能后,服务器和代理都可以扩展。问题是某些操作可能会因异常而失败,该类型在接收端是未知的。我正在开发一个设施来应对这种情况,并希望现在进行单元测试。为此,我需要模拟在远程站点上引发的异常在接收端是未知类型的情况。

2 个答案:

答案 0 :(得分:1)

首先,我不知道有任何方法可以防止从加载的程序集中加载类型。这意味着我们需要谈论组件 - 而不是类型。即使某个类型在第一次访问之前没有初始化,如果加载了您的类型的程序集将访问它,则无法使CLR忘记它。

换句话说,你必须有一个单独的受保护类型的DLL。其余部分可以通过多种方式解决,也就是说,您可以使用Assembly.LoadFrom在您需要的应​​用程序域中加载程序集,而不是使用appconfig。

这有多好,取决于你在这里尝试做什么,由你来决定。

答案 1 :(得分:1)

AppDomain.CreateDomain具有接受AppDomainSetup的重载。此类的许多属性与.config文件中的相应条目匹配。包括PrivateBinPath。 ApplicationBase设置CLR开始搜索的“home”目录。