将DLL加载到单独的AppDomain中

时间:2008-09-17 23:36:42

标签: c# .net appdomain

我想动态加载一个或多个DLL,以便它们使用与我的主应用程序不同的安全性或基本路径运行。如何将这些DLL加载到单独的AppDomain中并从中实例化对象?

5 个答案:

答案 0 :(得分:34)

更具体地说

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

如果一切正常(没有抛出异常),您现在已将TypeIWantToLoad的实例加载到新域中。您拥有的实例实际上是一个代理(因为实际对象位于新域中),但您可以像使用普通对象一样使用它。

注意:据我所知,TypeIWantToLoad必须从MarshalByRefObject继承。

答案 1 :(得分:4)

如果你的目标是3.5,那么你可以利用新的managed extensibility framework来处理所有繁重的工作。

答案 2 :(得分:2)

您可以使用AppDomain.CreateInstance方法执行此操作。您需要调用返回的ObjectHandle的Unwrap方法来获取实际对象。

答案 3 :(得分:0)

使用AppDomain.Create(...)创建一个新的Appdomain。 创建AppDomain后,将DLL加载到该AppDomain中。

查看Appdomain与Create *的所有方法。有些东西,比如CreateInstanceAndUnwrap等。

答案 4 :(得分:0)

如前所述,使用AppDomain.CreateDomain创建新的应用程序域。然后,您可以使用Load方法将程序集加载到其中,甚至可以使用ExecuteAssembly方法执行程序集。您可以使用GetAssemblies来查看是否已加载程序集。还要注意,加载后无法卸载组件。您需要卸载域名。